JQuery – 连续多次调用函数时,为什么只有最后一次调用的回调才能正确执行?
- 有一个函数在完成时触发回调;
- 我连续称这个function2或3次;
- 只有最后一次调用的回调才能达到预期的效果;
以下描述和代码举例说明了真实情况。
我有三对div。 我需要切换每对中的一个div并在其对不再可见时更改剩余可见div的状态。
然后,我创建了一个隐藏div并改变另一个div的背景颜色的函数。 我这样做是因为每当用户点击按钮显示描述和其他非必要项目时,我都想调用此function。
不幸的是,结果不是我预期的结果。 如果用户多次调用该函数,而不让该函数完成它的任务,则只有最后一个绑定的回调才能正常运行,其他的不会改变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,只需复制并粘贴到测试:
Test div{ width:100px;height:300px;background-color:red;float:left; } .blue { background-color: blue !important; }
在尝试执行下一个调用之前,我期待回调完成它的任务,但似乎浏览器正在尝试同时执行它们。 为什么会这样,我该怎么做呢?
element1 = $("#"+layerId); element2 = $("#"+layerId2);
你忘了声明这些变量var
,所以它们不是函数局部的,而是偶然的全局变量。 当第二次调用该函数时,它会覆盖第一个调用的element1
/ element2
的值,所以当回调发生时, element2
不是你所期望的。