7

我正在研究使用 jQuery 构建的 ui 选项卡。除了一个问题外,一切正常 - 我做了一个 setInterval 运行一个执行触发器(“click”)的函数,以便它在 5000 毫秒后转到下一个选项卡。它可以很好地运行每个选项卡,问题是如果用户手动单击选项卡,setInterval 的计时器不会在 0 处重新启动。例如,如果用户要在 0 毫秒开始在 tab1 上单击 tab2 在2000 毫秒,setInterval 不会回到 0,它会从 2000 开始并运行到 5000 毫秒,然后会转到 tab3。我明白为什么会这样,我只是想知道是否有一种方法可以重新启动 setInterval 计时,而无需执行 clearInterval() 并创建一个全新的 setInterval()。任何见解将不胜感激。

更新

感谢您的回复 - 我试图避免使用 clearInterval 的原因是因为我遇到了如何以 clearInterval 完全停止 setInterval 的方式编写代码的问题。该代码设置为在用户单击选项卡时进行跟踪。问题是自动更改功能利用了触发器('click'),因此它运行我在标签自动更改时也编写的 clearInterval 函数。它本身似乎运行得很好,但是一旦用户开始单击选项卡,setInterval 就会出现异常行为并无法预测地切换选项卡。我怀疑正在发生的事情是几个 setIntervals 正在同时运行......这是代码(如果你还没有猜到,我在 javascript/jquery 方面很新)。我已经注释掉了部分,以便它可以正常工作,但它仍然没有

// auto change tabs
            if( options.interval ) {

                function timerCom() {
                    if( !$(".controller").hasClass('paused') ) {
                        var i = $(".tab-current > a").attr("rel");
                        //alert(i);
                        if( i == 3 ) {i = 0};
                        $container
                            .find('a')
                            .eq(i)
                            .trigger('click');
                    }    
                }

                //$("#promo-items > li > a").click(function () {
                    //var timer;
                    //if( timer != null ) {clearInterval(timer);}
                    timer = setInterval(timerCom, options.interval);

                //});

            }
4

4 回答 4

8

不,没有办法在setInterval不清除计时器的情况下重新启动设置的计时器。

于 2010-12-01T19:19:56.280 回答
4

你不能真正改变间隔或超时,只能清除它们。也就是说,创建一个清除间隔的函数应该是一件简单的事情,然后立即使用新的时间值启动一个新的但相同的函数。

var intervalID;
var resetTimer = function() {
  if (intervalID) { clearInterval(intervalID) };
  intervalID = setInterval(function() {
    console.log('doing stuff!');
  }, 5000);
};
于 2010-12-01T19:20:10.367 回答
1
timer = setInterval(function() {
  timerCom();
}, options.interval);
于 2011-02-22T21:23:50.827 回答
0

我知道这篇文章已经有 2 年多了,但我刚才遇到了类似的问题,我找到了解决方案。

我正在编写一个图像滚动器,它会在设定的时间后自动切换到下一个图像,并且每当我单击导航按钮时,转换都会移动两次。

这是我的解决方案:

使区间变量(timer在您的情况下)有点全局。

即在options节中(假设它是之前定义的,然后是后来分配的),添加一个空timer变量。

var options = {
'interval',
//Other variables
'timer',
};

然后,在处理单击事件时调用clearInterval两次。

$("#promo-items > li > a").click(function () {

if( options.timer != null ) {
clearInterval(options.timer);
clearInterval(options.timer);
}

options.timer = setInterval(timerCom, options.interval);

});

对我来说就像一个魅力。

再一次,对不起,如果这太晚了。

于 2013-09-02T07:08:39.803 回答