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 關注
- 938 瀏覽
添加回答
舉報