gpt4 book ai didi

javascript - JQuery - 连续多次调用一个函数时,为什么只有最后一次调用的回调正确执行?

转载 作者:行者123 更新时间:2023-11-29 09:58:46 26 4
gpt4 key购买 nike

  1. 有一个完成后触发回调的函数;
  2. 我连续调用此函数 2 或 3 次;
  3. 只有最后一次调用的回调才符合预期;

以下描述和代码举例说明了真实场景。

我有三对 div。我需要切换每对中的一个 div,并在其对不再可见时更改剩余可见 div 的状态。

然后,我做了一个功能来隐藏一个div并改变另一个div的背景颜色。我这样做是因为我想在用户单击按钮以显示描述和其他非必要项目时调用此函数。

不幸的是,结果不是我所期望的。如果用户多次调用该函数,而没有让该函数完成其任务,则只有最后一次绑定(bind)的回调会正常运行,其他回调不会更改 div 的背景颜色或不同步由于延迟,与另一个 div。

这是javascript:

function toggleLayer(layerId,layerId2) {
//element1 is the first div of the pair. The one to be hidden.
element1 = $("#"+layerId);
//element2 is the second div of the pair. The background-color of this one will be changed when the element1 is hidden.
element2 = $("#"+layerId2);

//Hiding the first div
element1.toggle("slow",function() {
//Changing the color of the second div
element2.toggleClass("blue");
});
}

这是完整的 HTML,只需复制并粘贴即可进行测试:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
<!--

function toggleLayer(layerId,layerId2) {
//element1 is the first div of the pair. The one to be hidden.
element1 = $("#"+layerId);
//element2 is the second div of the pair. The background-color of this one will be changed when the element1 is hidden.
element2 = $("#"+layerId2);

//Hiding the first div
element1.toggle("slow",function() {
//Changing the color of the second div
element2.toggleClass("blue");
});
}

-->
</script>
<style type="text/css">
div{
width:100px;height:300px;background-color:red;float:left;
}
.blue {
background-color: blue !important;
}
</style>
</head>
<body>

<div id="d1"></div>
<div id="d11"></div>
<div id="d2"></div>
<div id="d22"></div>
<div id="d3"></div>
<div id="d33"></div>



<input type="button" onclick="toggleLayer('d1','d11');" value="1" style="clear:both;float:left;" />
<input type="button" onclick="toggleLayer('d2','d22');" value="2" style="clear:both;float:left;" />
<input type="button" onclick="toggleLayer('d3','d33');" value="3" style="clear:both;float:left;" />
<input type="button" onclick="toggleLayer('d1','d11');toggleLayer('d2','d22');" value="1+2" style="clear:both;float:left;" />
<input type="button" onclick="toggleLayer('d1','d11');toggleLayer('d2','d22');toggleLayer('d3','d33');" value="1+2+3" style="clear:both;float:left;" />

</body>
</html>

我期待回调在尝试执行下一个调用之前完成它的任务,但浏览器似乎试图同时执行它们。为什么会发生这种情况,我该如何正确处理?

最佳答案

    element1 = $("#"+layerId);
element2 = $("#"+layerId2);

您忘记声明这些变量 var,因此它们不是函数局部变量,而是偶然的全局变量。第二次调用该函数时,它会覆盖第一次调用的 element1/element2 的值,所以当回调发生时 element2 不是什么你期待的。

关于javascript - JQuery - 连续多次调用一个函数时,为什么只有最后一次调用的回调正确执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6130249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com