setTimeout和for循环延迟

时间:2018-11-21 08:18:00

标签: javascript loops click delay element

我从这里获得以下代码: How do I add a delay in a JavaScript loop? 我在IE的控制台中使用它,在此代码之后,我在控制台中使用myFunction()调用该函数以运行它;第一个代码运行良好,它单击第二个标记为“ something”的元素10次,两次单击之间的延迟为3000毫秒。

function myFunction() {
    (function myLoop (i) {          
    setTimeout(function () {   
    document.getElementsByTagName("something")[1].click();                
    if (--i) myLoop(i);      //  decrement i and call myLoop again if i > 0
   }, 3000)
})(10);
}

我想通过foor循环更改此代码中的数字“ 1”,因此我想创建一个代码,该代码单击名为“ something”的元素。 我创建了以下代码,但无法正常工作:

for (x=1;x<10;x++){
function myFunction() {
(function myLoop (i) {          
    setTimeout(function () {   
    document.getElementsByTagName("something")[1].click();                
    if (--i) myLoop(i);      //  decrement i and call myLoop again if i > 0
   }, 3000)
})(10);
}

}

3 个答案:

答案 0 :(得分:0)

如果要间隔打印每个元素,则需要将计时值乘以整数,否则所有这些元素将一次记录。

此外,您可能无需在循环内创建myFunction

for (var x = 1; x < 5; x++) {
  (function(i) {
    setTimeout(function() {
      console.log(i);
    }, i * 1000)
  }(x))
}

答案 1 :(得分:0)

通常更容易使用setInterval,而不是setTimeout的循环。一切都变得更加简单:

var count = 10
var intv = setInterval(function(){
  if (count === 0 ) {
    clearInterval(intv)
    console.log("done")
    return
   }
  // do something
  console.log(count--)
}, 1000)

但是您可以递归调用setTimeout

(function myLoop (i) {          
    setTimeout(function () {   
      console.log("loop: ", i)
      if (--i) myLoop(i);      
   }, 1000)
})(10);

将整个内容放入for循环并递归调用是很奇怪的,因为循环将运行并产生一堆独立运行的超时,我认为这不是您想要的。

答案 2 :(得分:-1)

function myFunction() {
    (function myLoop (i) {          
        setTimeout(function () {   
        document.getElementsByTagName("div")[1].click();                
        if (--i) myLoop(i);      //  decrement i and call myLoop again if i > 0
        }, 3000)
    })(10);
  }

for (x=1;x<10;x++){
  myFunction();
}
<div>1</div>

尝试这样。我用div代替了something