2009-12-14 88 views
2

我有一個jQuery函數,它在對象上執行.clone(),然後在克隆對象上執行.insertAfter().slideDown()。這整個功能被包裹在while循環中。我會保持這個短而簡潔越好,顯示了通用例如:jQuery while循環不等待動畫

while (statement) { 
    // code for clone and insert ... 
    $("#newly_created_object").slideDown(500); 
} 

如何防止下一個while循環從.slideDown()動畫之前發射(或任何其他形式的動畫爲此事)結束?

預先感謝您!

+0

我增加了一個顯式終止條件到我的代碼。 – tvanfosson 2009-12-14 02:27:35

回答

6

您可能需要首先創建並插入所有元素,將它們存儲在陣列中。然後,您可以使用遞歸函數從數組中彈出一個元素並對其進行動畫處理,在動畫的回調處理程序的其餘元素上調用您的函數 - 以確保第一個元素在下一次啓動之前完成。

... 
    var elems = []; 
    while (statement) { 
     var elem = ...clone and insert element, returning element... 
     elems.push(elem); 
    } 

    animateElems(elems); 
} 


function animateElems(elems) 
{ 
    if (elems.length > 0) { 
     var elem = elems.shift(); 
     $(elem).slideDown(500, function() { 
      animateElems(elems); 
     } 
    } 
} 
+0

迄今最優雅的解決方案 – 2009-12-14 01:59:51

+0

同意,簡直輝煌!我非常感謝,謝謝! – 2009-12-14 02:22:23

3

你必須使動畫同步,但這不是一個好主意,因爲它會阻止瀏覽器並惹惱用戶。這是關於該主題的另一個問題:JQuery synchronous animation

一個更好的主意是使用回調函數,該函數將在動畫完成時執行。像這樣:

function cloneAndInsert(elm){ 
    if(statement){ 
    // code for clone and insert 
    $("#newly_created_object").slideDown(500, function(){ 
     cloneAndInsert(elm); 
    }); 
    } 
} 

這段代碼會在一個對象(遞歸)完成時調用它自己。

+0

我打算繼續解決你的問題,但對於電視的解決方案,我只需要添加幾行,而不是重寫我的功能,這比我上面給出的通用示例複雜得多。儘管如此,謝謝,您的意見也非常感謝! – 2009-12-14 02:29:30

1

您可以檢查元素仍然被動畫這樣的:

while (statement) { 
    if ($("#newly_created_object").is(":animated")) continue; 
    $("#newly_created_object").slideDown(500); 
} 

雖然它可能不是最好的解決辦法,因爲你能不能讓用戶的瀏覽器忙碌。

正確的方法動畫結束後做的動作:

$("#newly_created_object").slideDown(500, function() { 
    alert('this alert box appears when animation is finished'); 
});