2013-08-30 33 views
1

我有值的數組,我想將這些值設置爲佔位符到我的輸入。在循環結束後重新啓動jQuery.each()

如何實現這個使用jQuery.each()只有,因爲我解決了我的問題this solution,它完美的作品。

我試着這樣做重新啓動它,但它不工作:

if(index==arr.length) index=0; 

HTML代碼:

Values : <input name='input' id='input' /> 

JS/jQuery代碼:

var arr = new Array(); 
for (var i = 0; i <= 5; i++) { 
    arr.push('Value ' + i);//fill array with values 
} 

function eachChange(){ 
    var x=0; 
    $.each(arr, function (index, value) { 
     x++; 
    setTimeout(function(){ 
     $('input').attr('placeholder', value); 
     }, x * 1000); 
     if(index==arr.length) index=0; 

}); 

} 
eachChange();//call function 

小提琴:http://jsfiddle.net/charaf11/5ZQgX/

回答

1

嘗試以這種方式重新啓動.each()循環有兩個問題。首先,這不是如何.each()真正的作品。這不是一個循環,而是在每個元素上調用函數的簡寫。如果你給那個匿名函數的名稱(讓我們與setPlaceholder()去),該.each()通話基本上是這樣做的:

setPlaceholder(0, arr[0]); 
setPlaceholder(1, arr[1]); 
setPlaceholder(2, arr[2]); 
setPlaceholder(3, arr[3]); 
setPlaceholder(4, arr[4]); 
setPlaceholder(5, arr[5]); 

它傳遞給不用於循環用途的函數索引值,所以試圖設置它到0不會對.each()調用產生任何影響。

第二個問題是你的條件。它永遠不會實際開火,因爲.each()調用的最終「迭代」將具有arr.length - 1作爲其值,而不是arr.length

我不知道爲什麼你想擁有它不斷循環,但如果這是你的目標,你可以做到這樣的:

function eachChange(){ 
    $.each(arr, function (index, value) { 
     setTimeout(function() { 
      $('input').attr('placeholder', value); 
     }, index * 1000); 
     if (index == arr.length - 1) { 
      setTimeout(eachChange, (index + 1) * 1000); 
     } 
    }); 

} 
eachChange();//call function 

什麼是應該做的是時間表eachChange()再次調用1在發生最後一次佔位符更新後第二次。您可以添加一些其他檢查來限制它遞歸的次數,但是如果您希望它無限期地發生,應該這樣做。

Here's an updated fiddle demonstrating it.

+0

感謝您的答覆:) –

1

你可以這樣

var arr = new Array(); 
for (var i = 0; i <= 5; i++) { 
    arr.push('Value ' + i);//fill array with values 
} 

function eachChange(){ 
$.each(arr, function (index, value) { 
setTimeout(function(){ 
    $('input').attr('placeholder', value); 
    //if it is the last element in arr setTimeout and call eachChange() 
    if(index>=arr.length-1){ 
     setTimeout(function(){ 
      eachChange();  
     },1000); 
    } 

    }, index * 1000); 
}); 

} 
eachChange();  

http://jsfiddle.net/R274P/1/

+0

感謝這個解決方案,它也能工作 –

0

我不認爲你可以重新設置$。每個功能的計數器與arr.length比較指標,因爲它似乎封裝一個簡單的for循環。你沒有從外面訪問櫃檯。

然而,嘗試:

function eachChange(initX){ 
    var x = initX || 0; 
    $.each(arr, function (index, value) { 
     x++; 
     setTimeout(function(){ 
      $('input').attr('placeholder', value); 
     }, x * 1000); 

     // Call yourself but pass current x 
     if(index==arr.length) eachChange(x); 

    }); 
} 

,如果你想要使用X重置刪除INITX的一部分,但我想你想的是要保持從以前的循環完成,其中計數。