2016-05-26 55 views
0

我試圖在一個序列中動畫所有LI,但代碼是一次動畫所有LI。SetTimeout on vanilla JS on [] forEach.call不能按順序工作

我找不到任何有用的答覆,我知道如何在JQuery中做到這一點,但這裏沒有東西加起來。

我試圖添加Timeout到事件處理程序和被調用函數,兩種方法都不起作用。

這是函數

function changeLi() { 
    setTimeout(function() { 
    [].forEach.call(li, function(li) { 
     li.style.transform = "translateX(200px)"; 
    }, 900); 
    }); 
} 

鏈接codepen:

http://codepen.io/damianocel/pen/PzYXmv

我試圖stopPropagation /的preventDefault加入呼叫,但沒有幫助。

+0

你的括號匹配就會混亂。請修復它並正確縮進您的代碼。 – Bergi

+0

你似乎對[setTimeout工作原理]有一個基本的誤解(https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout)。另外[stopPropagation](https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation)和[preventDefault](https://developer.mozilla.org/en-US/docs/ Web/API/Event/preventDefault),兩者都只適用於事件。 – Hamms

+0

你正在使用'setTimeout'就好像它像'sleep'一樣工作。請參閱[這裏](Python while循環轉換爲Javascript)解決方案。 – Bergi

回答

4

您的代碼有幾個問題。首先,900不是您的setTimeout的參數,而是forEach.call的參數。這似乎只是一個錯誤。

其次,即使上面的是固定的,你的代碼將簡單的設置爲900毫秒在未來接單超時遍歷所有li的列表中的,在一次改造他們。我相信你真的想要做的就是循環所有的項目,並定義一個超時運行在未來的運行時間,每個運行一定的時間。由於forEach提供了一個索引,因此您可以使用靜態ms計數,並將其與您當前列表的li列表中的多個進行比較,以從進一步生成動畫

我相信你實際上是在尋找這樣的事情,它會遍歷貴麗列表,並設置轉換上從以前的每個項目100毫秒發生:

function changeLi() { 
    [].forEach.call(li, function(li, i) { 
    setTimeout(function() { 
     li.style.transform = "translateX(200px)"; 
    }, 100 * i); 
    }); 
} 
+0

這有點奏效,但它在2次迭代後停止。 它正確地爲第一個項目設置動畫,然後跟隨動畫整個UL一次。 有沒有辦法使用bind()作爲「this」上下文? –

+0

爲了澄清,你是對的,我確實試圖讓變換在給定的時間範圍內按順序發生。 –

+0

完美,剛剛看到您的編輯,這完美無瑕的作品:-) –