2013-05-25 78 views
2

我想要備份,刪除列表中的每個項目,並在1秒後追加每個項目。

我想是這樣的:

var backup = $('#rGallery').html(); 
$('#rGallery li').remove(); 
console.log($(backup).filter('li').length); /* it logs like 135 */ 
$(backup).filter('li').each(function(){ 
    var the = $(this); 
    var timeout = setTimeout(function(){ 
     console.log(the.html()); /* it logs the html, but all at the same time*/ 
     $('#rGallery').append('<li>'+the.html()+'</li>'); 

     /*return*/ 
    },1000); 
}); 

其作品中,項目被刪除,然後再append'ed,問題是,他們都正在1秒後追加。而不是每個人都要等上一秒鐘。

我在這裏錯過了什麼?

+0

怎麼樣的回報..? – Gautam3164

+0

我不知道還有什麼可以嘗試..結果它沒有它雖然.. –

+3

每個循環將設置所有的超時在幾毫秒內和一秒鐘後,所有的超時將被執行。需要rivese代碼來調用你的函數在當時傳遞一個元素。 – HMR

回答

6

由於您告訴他們所有人都在一秒內跑完,他們不會被添加到某個魔法隊列並等待開始計數。

$(backup).filter('li').each(function(index){ //added index here 
    var the = $(this); 
    var timeout = setTimeout(function(){ 
     console.log(the.html()); /* it logs the html, but all at the same time*/ 
     $('#rGallery').append('<li>'+the.html()+'</li>'); 

     /*return*/ 
    },1000*(index+1)); //multiplied it here 
}); 
3

setTimeout沒有阻塞;它計劃超時,然後繼續。因此,each()的下一次迭代立即發生,它在完全相同的時間(等)下調度下一個元素。

因此,應該改變你的代碼,像這樣的(一種方法),它運行的功能每1000毫秒,加上下一單元backup

var backup = $('#rGallery li'); 
var i = 0; 
$('#rGallery li').remove(); 

var interval = setInterval(function() { 
    if (i === backup.length) { 
     clearInterval(interval); 
    } else { 
     var the = $(backup).eq(i); 

     $('#rGallery').append('<li>'+the.html()+'</li>'); 
    } 

    i++; 
}, 1000);