1

値の配列があり、それらの値をプレースホルダーとして入力に設定したいと考えています。

このソリューションで問題を解決 し、完全に機能するという理由jQuery.each() だけでこれを達成する方法。

私はそれを再起動するためにこれをやろうとしましたが、うまくいきません:

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/

4

3 に答える 3

1

.each()この方法でループを再開しようとすると、2 つの問題があります。何よりもまず、それは.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]);

.each()関数に渡すインデックス値はループの目的で使用されないため、0 に設定しようとしても呼び出しには影響しません。

2 番目の問題は、if 条件です。.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 秒後に再度呼び出されるようにスケジュールすることです。再帰回数を制限するために他のチェックを追加することもできますが、無期限に発生させたい場合は、それでうまくいくはずです。

これは、それを示す更新されたフィドルです。

于 2013-08-30T15:35:23.383 に答える
1

このようにインデックスを arr.length と比較できます

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/

于 2013-08-30T15:30:44.387 に答える
0

単純な for ループをカプセル化しているように見えるため、 $.each 関数のカウンターをリセットできるとは思いません。外部からカウンターにアクセスすることはできません。

ただし、試してください:

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 の部分を削除しますが、前のループが終了した場所から数え続けたいと思います。

于 2013-08-30T15:32:08.793 に答える