如何使用settimeout来循环函数

时间:2013-04-25 18:11:10

标签: jquery

我有一张幻灯片,其中有4张图片有一个分页,现在我希望它们在循环中逐个显示,为了循环我有这个代码:

  function myfn(interaltime) {
  setTimeout('$("#picgallery_pagging li:eq(0)").trigger("click")', 0);
  setTimeout('$("#picgallery_pagging li:eq(1)").trigger("click")', interaltime);
  setTimeout('$("#picgallery_pagging li:eq(2)").trigger("click")', interaltime*2);
  setTimeout('$("#picgallery_pagging li:eq(3)").trigger("click")', interaltime*3);
  setTimeout('myfn('+interaltime+')',interaltime*4);
  };
  myfn(3000);  

我的问题:它无法正常工作,只运行一次,第二轮内部时间变量为空

分页中的每个按钮运行我的自定义功能效果以显示图片,因为你看我必须在我的分页上的每个按钮上触发点击功能。(我不知道如何使用我自己的功能在jquery中使用延迟)

注意:我在控制台日志中检查了intervaltime变量,并且在seconde转弯时它是空的!但我不知道如何解决它! 编辑:我使用了setInterval但是第二次使用时intercaltime变量仍为空

3 个答案:

答案 0 :(得分:2)

你将字符串传递给setTimeout - 这不是最佳做法,而且可能完全不可靠。

试试这个,而不是:

function autoclick($el, delay) {
    var i = 0, n = $el.length;
    (function loop() {
        $el.eq(i).trigger('click');    // do your thang
        i = (i + 1) % n;               // increment and reset (if required)
        setTimeout(loop, delay);       // loop "recursively"
    })();                              // invoke immediately
}

autoclick($('#picgallery_pagging li'), 1000);

它消除了代码中的重复,并安排为每个元素反复调用自己,而不是整个四个元素。

调用不是真正的递归,即使它看起来像它,因为它实际上是浏览器的事件循环,它负责一遍又一遍地调度函数调用。

http://jsfiddle.net/alnitak/PfmVt/

演示

答案 1 :(得分:0)

其中一个选项是这样的:

function myfn(interaltime) {
    function wrapper(){
        do_stuff();
        setTimeout(wrapper, interaltime);
    }
    setTimeout(wrapper, 0);
} 

您基本上将超时设置为一次又一次地运行相同的功能。这是非常简化的样本,甚至没有尝试提供取消循环的方法。此外,请注意,它不是任何方式的递归调用,因此您不会遇到堆栈溢出问题。

更简单的选择是使用setInterval:

function myfn(interaltime) {
    return setInterval(do_stuff, intervaltime);
}

这样你就可以取消循环,比如

var loop = myfn(100);
//somewhere later
clearInterval(loop);

答案 2 :(得分:0)

尝试:

  setTimeout(function() {
                $("#picgallery_pagging li:eq(0)").trigger("click");
             }, 0);

而不是

  setTimeout('$("#picgallery_pagging li:eq(0)").trigger("click")', 0);

并重复所有其他setTimeouts。实质上,对setTimeout

使用匿名函数