43

我在 jQuery 插件中调用了一个 setInterval(),但我想从我的主页中清除它,我无法访问存储 setInterval 的变量。

有没有办法清除页面上的所有计时器?

4

8 回答 8

61

这可能是清除所有间隔的逻辑之一......

for (var i = 1; i < 99999; i++)
        window.clearInterval(i);
于 2011-08-21T03:00:46.500 回答
25

You can override setInterval:

window.oldSetInterval = window.setInterval;
window.setInterval = function(func, interval) {
    var interval = oldSetInterval(func, interval);
    // store it in a array for stopping? stop it now? the power is yours.
}
于 2009-06-05T22:57:37.197 回答
10

不,你不能,不能没有原始变量。

于 2009-06-05T22:27:01.970 回答
6

答案

for (var i = 1; i < 99999; i++)
     window.clearInterval(i);

是我要找的那个。通过对这个非常简单的逻辑进行一点改进,我能够做这样的事情。

var i = 0;
var rotatorId;
var rotator;

rotator =  setInterval(function() {myfunction(), 3000});
rotatorId[i] = rotator;
i++;

if (rotator > 1) {
   for(i = 1; i < rotatorId.length; i++){
      clearInterval(rotatorId[i]);                      
    }                       
}
于 2013-11-09T12:52:58.117 回答
3

我实现这一点的方法是拥有一个应用程序级数组(例如,Application.setIntervalIds = []),每当创建一个时,我都会将 setInterval id 推送到该数组。然后我可以在需要时简单地在数组中的每个 id 上调用 window.clearInterval(id) 。

例如,当我创建一个新的 setInterval 时,我会写一些类似 (coffeescript) 的内容:

id = setInterval (() -> function2call()), timeout
Application.setIntervalIds.push id

然后我有一个 clearAllSetIntervals 函数,我可以在需要时调用:

Application.clearAllSetIntervals = () ->
    $.each Application.setIntervalIds, (index, id) ->
         window.clearInterval id
于 2013-08-21T12:21:09.550 回答
2

我发现的最好方法...

var clearAllIntervals = function ( ) {

    var intervals = [];

    $(".elements").each(function() {
        intervals.push( setInterval(function() {

        }, 1000) );
    });

    return function clearAll ( ) {
        intervals.forEach( clearInterval );
    }

}( );

// When you want to clear them:
clearAllIntervals( );
于 2017-05-18T10:38:18.250 回答
1

我将每个间隔 id 存储在一个隐藏的容器中,然后调用此函数循环并使用 window.clearInterval 删除每个 id。

function clearAllIntervals() {
    $('.intervals-holder span').each(function() {
        var clearThis = parseInt($(this).text(), 10); // gets the interval id from the span holder
        window.clearInterval(clearThis); // removes the interval
        $(this).remove(); // removes the span holding the id
    })
}

// setting interval
// (i clear all first because in my code the buttons can be double clicked..
// ..and there is more than one button to start what i want to be started)
function audioRingingInterval() {
    clearAllIntervals();
    var intervalId = setInterval(audioRingingStartFunction, 500);
    $('.intervals-holder').append('<span>'+intervalId+'</span>');
}
// i call this when i want to set the interval and it calls the interval function above
function audioRingingStartFunction() {
    $('.audio-blinking').toggleClass('blinking');
}
// i call this when i want to stop the interval
function audioRingingStopFunction() {
    clearAllIntervals();
    $('.audio-blinking').removeClass('blinking');
}

这很丑陋,但就我的目的而言,它有效。

于 2018-02-16T05:24:26.960 回答
1

这对我有用。

//Setting interval
var startInterval = setInterval(function () {
 //interval code here
}, 1000);

//Clearing interval
var countInterval = startInterval != undefined ? startInterval : 0;

 for (var a = 0; a < countInterval; a++) {
  clearInterval(a);
 }
于 2018-04-20T10:45:15.817 回答