2012-07-05 112 views
0

我有一個for循環,它通過數據屬性選擇li來運行。將對象傳遞給for循環

我希望每一組Lis都有一個交錯淡入。這工作正常,直到我把動畫放在setTimeout內。相反,通過每個裏循環的,它堅持在數字5

JS:

for (i=0;i<6;i++) { 
console.log(thisI); 
var thisLi = $("li[data-order='"+i+"']"); 

setTimeout(function() { 
TweenMax.to(thisLi,0.4, {css:{opacity:1}}); 
},200*i); 

} 

的HTMl

<li data-order="1">sometext</li> 
<li data-order="1">sometext</li> 
<li data-order="2">sometext</li> 
<li data-order="3">sometext</li> 
<li data-order="2">sometext</li> 
<li data-order="3">sometext</li> 

CSS

li { 
    opacity:0; 
} 

這裏的鉻合金登錄時,我console.log(thisLi);setTimeout

<li data-order=​"5" style=​"opacity:​ 0.11640000000000006;​ ">​…​</li>​ , <li data-order=​"5" style=​"opacity:​ 0.11640000000000006;​ ">​…​</li>​ ]

回答

5

通過setTimeout回調執行的時間,循環已完成如此i已經達到了它的最大值。您可以使用封閉在每次迭代捕捉i值:

for (i = 0; i < 6; i++) { 
    (function (i) { 
     var thisLi = $("li[data-order='" + i + "']"); 
     setTimeout(function() { 
      TweenMax.to(thisLi, 0.4, { css: { opacity:1 } }); 
     }, 200 * i); 
    }(i)); 
} 

邊注:如果你不聲明i其他地方,那麼它泄漏到了全球範圍。

+0

歡呼聲中,偉大工程:) – 2012-07-05 12:42:08

+0

@FrankAstin - 不客氣,很高興我能幫助:) – 2012-07-05 12:42:36

+0

我們如何工作圍繞保持我的私人? – 2012-07-05 12:47:40

1

我認爲你對變量thisLi的範圍有問題。嘗試創建這樣一個封閉:

var thisLi = $("li[data-order='"+i+"']"); 
var f = function() {TweenMax.to(thisLi,0.4, {css:{opacity:1}});}; 

setTimeout(f,i*200);