【问题标题】:javascript using settimeout() with a loopjavascript 使用带有循环的 settimeout()
【发布时间】:2013-01-30 06:33:11
【问题描述】:

我得到了一个包含 8x10 单元格的表格.. 每个销售都有一个具有自己 id 的输入元素 (11, 12, ... , 21,22,23,...) 现在我想在之后填充这些输入(比如说 0.5 秒) 我刚刚输入了一些值进行测试

        Betrag = new Array();
        Betrag[0] = new Array();
        Betrag[1] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","513.000,00");
        Betrag[2] = new Array("asd","adsd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[3] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[4] = new Array("asd","uisgui","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[5] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[6] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[7] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");
        Betrag[8] = new Array("asd","asd","asd","asd","asd","asd","asd","asd","asd","asd","asd");

          for(i=1; i<=8; i++){
            for(k=1; k<=10; k++){
              setTimeout(function schreiben(){document.getElementById(''+i+k+'').value= Betrag[i][k];}, 1000);
              //document.getElementById(''+i+k+'').value= Betrag[i][k];
            }
          }

编译器说“TypeError: Cannot read property '11' of undefined”

如果我不使用 settimeout() 函数,整个循环工作正常,但是使用这个函数我得到了这个错误..

【问题讨论】:

  • 您是否尝试过提醒 Betrag[1][1] 看看它返回了什么?
  • 当我运行它时,i 变为 9,k 变为 11。可能是线程问题。
  • setTimeout(function schreiben(){alert(Betrag[1][1])}, 1000);工作正常(好吧,它是一个无限循环^^)在警报窗口中获得“asd”
  • 你想同时填充所有输入,还是一个接一个(它们之间有延迟)?
  • 请参阅 this answer 了解为什么会发生这种情况以及如何解决它。

标签: javascript arrays loops multidimensional-array settimeout


【解决方案1】:

kifor 循环结束后 被读取(准确地说是1 秒)。然后它们的值是 9 和 11,导致数组溢出问题。

修复它的一个选项是创建一个可以完成工作的函数,并从ki 变量创建一个固定字符串来调用它:

function schreiben(__i, __k) {
   document.getElementById(''+__i+__k+'').value= Betrag[__i][__k];
}

然后像这样调用setTimeout

setTimeout("schreiben("+i+","+k+")", 1000);

不是最优雅的方式,但它确实有效。

【讨论】:

  • 好吧,我该如何解决这个问题?抱歉,我对 javascript 很陌生
  • 我正在尝试修复... :)
  • 嗯,某处出错了。。只有函数,然后是调用?
  • 你必须把函数放在循环之外。例如,放在Betrag = new Array() 之前。
  • 好吧,代码对我有用,但是现在这些值都汇集在一起​​了..希望它喜欢在第一个输入中填写值,然后在填写下一个值之前休息 50 毫秒下一个输入字段:S
【解决方案2】:

巴特弗里德里希是对的。不知道为什么要这样做,但是您可以在 schreiben 函数中声明几个 var,并在同一个 screiben 函数中递增它们。

【讨论】:

    【解决方案3】:

    你可以试试这样的:

        var i = 1;
        var k = 1;
        var obj = setInterval( function () {
            document.getElementById(i + '' + k).value= Betrag[i][k];
            if(k <= 10)
               k++;
            else
            {
                k = 1;
                if(i<=8)
                     i++;
                else
                     clearInterval(obj);
            }
        }, 1000);
    

    这是http://jsfiddle.net/Ex98V/的一个运行示例

    【讨论】:

    • 您将 k 设置为 0,这在原始问题中发生过什么?
    【解决方案4】:

    这应该按照您想要的方式工作。

    for(i=1; i<=8; i++){
        for(k=1; k<=10; k++){
            (function(i, k){
                setTimeout(function schreiben(){document.getElementById(''+i+k+'').value= Betrag[i][k];}, 1000*k + 10000*i);
                //document.getElementById(''+i+k+'').value= Betrag[i][k];
            })(i, k);
        }
    }
    

    为了让事情更清楚一点,请考虑像这样重构:

    for(i=1; i<=8; i++){
        for(k=1; k<=10; k++){
            setSchreibTimeout(i, k);
        }
    }
    
    function setSchreibTimeout(i, k){
        setTimeout(function schreiben(){document.getElementById(''+i+k+'').value= Betrag[i][k];}, 1000*k + 10000*i);
        //document.getElementById(''+i+k+'').value= Betrag[i][k];
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多