使用 settimeout 和 for 循环延迟

delay with settimeout and for loop

我从这里得到了这段代码: How do I add a delay in a JavaScript loop? 我在 IE 的控制台中使用它,在这段代码之后,我在控制台中使用 myFunction() 调用函数到 运行;第一个代码 运行s 完美,它点击第二个 "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);
}

}

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

如果你想每隔一段时间打印每个元素,你需要将时间值乘以一个整数,否则所有的元素将被一次记录。

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

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

通常使用 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 循环中并递归调用它虽然很奇怪,因为循环将 运行 并产生一堆单独的超时,这些超时将全部 运行 独立,我不这样做'想的就是你想要的。