2010-01-25 35 views
6

當jQuery選擇返回多個元素和我所有這些元素上做一個「了slideDown」比如我不知道......jQuery對多個元素的動畫,單個動畫線程/定時器還是多個?

$('.allthisclasss').slideDown();

有沒有一個單一的代碼迴路上下移動的所有對象同步還是如果jQuery分別處理所有對象,並且它們都有一個執行線程來移動它們自己?

我的問題是關於動畫優化,如果對於所有對象只有一個定時器而不是每個對象一個,那將會很好。

任何人都知道jQuery如何處理這種情況?

+1

你看過了嗎? – Marius 2010-01-25 16:42:45

+0

我會看一眼 – 2010-01-25 17:07:49

+0

我看着它,看到隊列如下..但甚至沒有看到「setTimeout」或「setIterval」...我明天會更深入地挖掘。 – 2010-01-28 04:28:51

回答

2

我終於有了答案:只有一個計時器可以動畫頁面中的所有內容。如果有什麼東西在隊列中,計時器創建一切舉動,一旦一切都完成後,計時器被殺害:

使用HTML:

<div id="test1" class="tests" style="background-color:#FFF; border:1px solid #000; width:40px; height:40px; position:absolute; left:0px; top:0px;"></div> 
<div id="test2" class="tests" style="background-color:#FFF; border:1px solid #000; width:40px; height:40px; position:absolute; left:0px; top:50px;"></div> 

JavaScript中使用:

var setIntervalDecorated = setInterval; 
setInterval = function(func, delai) { 
    var id = setIntervalDecorated(func, delai); 
    console.log('setInterval: ' + id + ' (' + delai + 'ms)'); 
    return id; 
}; 

var clearIntervalDecorated = clearInterval; 
clearInterval = function(id) { 
    console.log('clearInterval: ' + id); 
    clearIntervalDecorated(id); 
}; 

測試情況:

試驗1

$('#test1').animate({ left: '+=500' }, 5000, function() { console.log('test1: Animation complete'); }); 

setInterval: 5 (13ms) 
test1: Animation complete 
clearInterval: 5 

試驗2

$('.tests').animate({ left: '+=500' }, 5000, function() { console.log('tests: Animation complete'); }); 

setInterval: 5 (13ms) 
tests: Animation complete 
tests: Animation complete 
tests: Animation complete 
clearInterval: 5 

試驗3

$('#test1').animate({ left: '+=500' }, 5000, function() { console.log('test1: Animation complete'); }); 
$('#test2').animate({ left: '+=500' }, 5000, function() { console.log('test2: Animation complete'); }); 

setInterval: 5 (13ms) 
test1: Animation complete 
test2: Animation complete 
clearInterval: 5 

試驗4

$('#test1').animate({ left: '+=500' }, 5000, function() { console.log('test1: Animation complete'); }); 
setTimeout(function() { $('#test2').animate({ left: '+=500' }, 5000, function() { console.log('test2: Animation complete'); }); }, 1000); 

setInterval: 5 (13ms) 
test1: Animation complete 
test2: Animation complete 
clearInterval: 5 

謝謝

3

所有動畫會自動添加到jQuery中的全局效果隊列中。但是,這並不意味着它們會按順序進行動畫製作,只需製作一個簡單的測試頁,其中包含您可以同時滑動的十個元素。你會看到它們被同時執行。

爲了防止這種行爲,你可以讓自己的隊列,通過例如在queue documentation

快樂黑客是最好的形容!

+0

我在說動畫是同時發生的。每個隊列中的每個元素是否都有自己的動畫循環?像4個移動物體有他們的4個循環/定時器並行運行驅動自己的對象.. – 2010-01-28 04:27:55

+0

我認爲這是一個正確的假設,但嘗試它,讓我們知道° - ) – pixeline 2010-01-28 21:04:38

+0

我用裝飾模式找出..看到我的答案。 jQuery相當優化:) – 2010-09-02 14:43:25