3 回答
TA贡献1821条经验 获得超6个赞
var elems = $(parentSelect).nextAll(), count = elems.length;
elems.each( function(i) {
$(this).fadeOut(200, function() {
$(this).remove();
if (!--count) doMyThing();
});
});
请注意,.each()它本身是同步的 -调用.each()之后的语句仅在.each()调用完成后才执行。但是,在迭代中开始的异步操作.each()当然会以自己的方式继续。这就是这里的问题:淡化元素的调用是由计时器驱动的动画,并且这些动画以自己的速度继续进行。
因此,上面的解决方案可以跟踪淡出了多少个元素。每次调用.fadeOut()都会获取完成回调。当回调函数注意到所有涉及的原始元素都已计入回调时,可以放心地采取所有后续操作,以确保所有衰落都已完成。
这是一个有四年历史的答案(目前为2014年)。一种现代的方法可能涉及使用Deferred / Promise机制,尽管以上内容很简单,并且应该可以正常工作。
TA贡献1852条经验 获得超7个赞
可能要晚了,但我认为这段代码行得通...
$blocks.each(function(i, elm) {
$(elm).fadeOut(200, function() {
$(elm).remove();
});
}).promise().done( function(){ alert("All was done"); } );
TA贡献1784条经验 获得超7个赞
JavaScript是同步运行的,因此您放置的任何内容each()都不会运行,直到each()完成。
考虑以下测试:
var count = 0;
var array = [];
// populate an array with 1,000,000 entries
for(var i = 0; i < 1000000; i++) {
array.push(i);
}
// use each to iterate over the array, incrementing count each time
$.each(array, function() {
count++
});
// the alert won't get called until the 'each' is done
// as evidenced by the value of count
alert(count);
调用警报时,计数将等于1000000,因为直到each()完成警报才会运行。
- 3 回答
- 0 关注
- 880 浏览
添加回答
举报