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

您可以像这样将索引与 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 回答
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()调用产生任何影响。

第二个问题是你的 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 回答
0

我不认为您可以重置 $.each 函数的计数器,因为它似乎封装了一个简单的 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 部分,但我假设您希望它从前一个循环完成的位置继续计数。

于 2013-08-30T15:32:08.793 回答