【问题标题】:jQuery/JS infinite timed loopjQuery/JS 无限定时循环
【发布时间】:2012-01-09 23:54:58
【问题描述】:

我正在尝试在不同时间对屏幕上的不同元素进行一系列点击。我可以使用 setTimeout 函数轻松地做到这一点,但我需要让它成为一个无限循环!?

这是我目前如何处理代码的 sn-p。

setTimeout(function () {jQuery('.CR_1').trigger('click');}, 1000);
setTimeout(function () {jQuery('.CR_1').trigger('click');}, 5000);
setTimeout(function () {jQuery('.CR_2').trigger('click');}, 5500);

关于如何完成这项工作的任何想法?

编辑:让我更清楚一点。我试图一遍又一遍地以相同的顺序运行一组函数。 setInterval 工作得很好。对于任何混淆,我感到非常抱歉。

   setInterval ( "flips ()", 12000 );


function flips (){
    setTimeout(function () {jQuery('.CR_1').trigger('click');}, 1000);
    setTimeout(function () {jQuery('.CR_1').trigger('click');}, 5000);
    setTimeout(function () {jQuery('.CR_2').trigger('click');}, 5500);

    }

【问题讨论】:

  • 您或许可以在这里找到答案:stackoverflow.com/q/1224463/1031900
  • 目前还不完全清楚您要做什么。我假设您想一次单击一次,其他一些人假设您希望独立的计时器在整个地方运行... :-)
  • 请注意,您应该将代码更改为 setInterval(flips,12000);没有理由使用字符串形式(它会在您的代码周围创建一个函数包装器)。

标签: javascript jquery


【解决方案1】:

只需在您的函数中调用setTimeout

setTimeout(callMe, 1000);

function callMe() {
    jQuery('.CR_1').trigger('click');
    setTimeout(callMe, 1000);
}

您也可以使用setInterval,但我更喜欢这样做,因为它将在上次运行后 1000 毫秒被调用一次,而不是每 1000 毫秒调用一次,无论运行多长时间(如果进程是同步的)。

【讨论】:

  • 如果您注意到,各种功能和延迟各不相同。
  • 我的例子只是其中一项。其余的他可以填写。
【解决方案2】:

为什么不改用 setInterval?

【讨论】:

  • 因为 OP 想要调用不同的函数,每次调用的时间间隔也不同。
  • @Phrogz 所以只需使用 setInterval 3 次。
【解决方案3】:
clicky()

function clicky() {
   setTimeout(function () {jQuery('.CR_1').trigger('click');}, 1000);
   setTimeout(function () {jQuery('.CR_1').trigger('click');}, 5000);
   setTimeout(function () {jQuery('.CR_2').trigger('click');clicky()}, 5500);
}

【讨论】:

    【解决方案4】:

    我认为你应该使用setInterval 而不是setTimeout

    【讨论】:

    • OP 想要调用不同的函数,每次调用的时间间隔也不同。
    【解决方案5】:
    var delayedFunctions = [
      [1000,function(){ ... }],
      [5000,function(){ ... }],
      [5500,function(){ ... }]
    ];
    
    var fIndex = 0;
    function runDelayedFunctions(){
      var details = delayedFunctions[fIndex];
      setTimeout( function(){
        details[1].call(this);
        if (++fIndex >= delayedFunctions.length) fIndex=0;
        runDelayedFunctions();
      }, details[0] );
    };
    runDelayedFunctions();
    

    【讨论】:

    • 为什么要把简单的事情搞得这么复杂?
    • @BNL a) 没那么复杂,IMO; b) 根据我对原始问题的理解(和 TJCrowder 的),这是正确完成它的更简单方法之一。运行 n 并发 setInterval 循环(正如您的回答基本上所做的那样)是脆弱的。例如,如果第一个函数的运行时间一直比其他函数长,那么您的答案最终会中断,调用顺序会被打乱。
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多