如何清除所有间隔?

Nik*_*kov 41 javascript jquery set

我在用

varName = setInterval(function() { ... }, 1000);
Run Code Online (Sandbox Code Playgroud)

在我正在编写的jquery插件中设置几个间隔,但是当重新加载插件时,我需要清除这些间隔.我尝试将它们存储在变量中,如下所示:

(function($){
$.mosaicSlider = function(el) {
    var base = this;        
    var transitionInterval, mainInterval;

...

base.init = function() {
    mainInterval = setInverval(function() { ... }, 1000);
}

base.grid = function() {
    this.transition() = function() {
         transitionInterval = setInterval(function(...) {
    }
}

base.init();
Run Code Online (Sandbox Code Playgroud)

我尝试在base.init()函数中杀死这些间隔,如下所示:

clearInterval(transitionInterval);
clearInterval(mainInterval);
Run Code Online (Sandbox Code Playgroud)

像这样:

window.oldSetInterval = window.setInterval;
window.setInterval = new function(func, interval) {  }
Run Code Online (Sandbox Code Playgroud)

Zir*_*rak 59

将它们存储在一个对象中.由于你是唯一一个制作这些间隔的人,并且你知道它们是什么,你可以存储它们,然后随意弄乱它们.我会创建一个专门用于此的对象,例如:

var interval = {
    // to keep a reference to all the intervals
    intervals : new Set(),

    // create another interval
    make(...args) {
        var newInterval = setInterval(...args);
        this.intervals.add(newInterval);
        return newInterval;
    },

    // clear a single interval
    clear(id) {
        this.interals.delete(id);
        return clearInterval(id);
    },

    // clear all intervals
    clearAll() {
        for (var id of this.intervals) {
            this.clear(id);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

你的第一个问题可能是

为什么要为此单独制作一个对象?

好的Watson,这是为了让你的插件/项目的手工间隔远离窥探,所以你不会弄乱在与你的插件无关的页面中设置的其他间隔.

是的,但为什么我不能将它存储在基础对象中?

你当然可以,但我认为这种方式更清洁.它将您在基础中执行的逻辑与奇怪的超时逻辑分开.

为什么将间隔存储在Set而不是数组中?

更快的访问和一些更清洁的代码.你可以去任何一种方式,真的.


Sud*_*oti 48

你可以这样做,

var interval_id = window.setInterval("", 9999); // Get a reference to the last
                                                // interval +1
for (var i = 1; i < interval_id; i++)
        window.clearInterval(i);
//for clearing all intervals
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个好主意.[规范](http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#list-of-active-timeouts)不保证句柄的任何特定顺序,只是它们是数字和唯一的. (11认同)
  • 坏主意,因为 @JanDvorak 指定的原因,并且它也会停止不是由您的代码创建的间隔。 (2认同)

小智 9

初始化Timer并将其设置为窗口对象.Window.myInterval将保存Timer的ID.

喜欢 window.myInterval = setInterval(function() { console.log('hi'); }, 1000);

要清除Interval,你可以这样写

if(window.myInterval != undefined && window.myInterval != 'undefined'){
    window.clearInterval(window.myInterval);
    alert('Timer cleared with id'+window.myInterval);
}
Run Code Online (Sandbox Code Playgroud)

  • 我不知道这种方法是否有问题但是现在,它对我有用,谢谢. (2认同)