【问题标题】:Restart jQuery.each() after loop ends循环结束后重启 jQuery.each()
【发布时间】:2013-09-03 09:23:51
【问题描述】:

我有一组值,我想将这些值设置为我的输入的占位符。

如何使用jQuery.each() only 来实现这一点,因为我用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/

【问题讨论】:

    标签: javascript jquery html each


    【解决方案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 秒后再次调用。您可以添加一些其他检查来限制它的递归次数,但是如果您希望它无限期地发生,那应该可以解决问题。

    Here's an updated fiddle demonstrating it.

    【讨论】:

    • 感谢您的回复 :)
    【解决方案2】:

    我不认为你可以重置 $.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 部分,但我假设您希望它从上一个循环完成的位置继续计数。

    【讨论】:

      【解决方案3】:

      您可以像这样将索引与 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/

      【讨论】:

        猜你喜欢
        • 2023-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 2022-01-18
        • 2021-09-09
        • 1970-01-01
        相关资源
        最近更新 更多