Как очистить все интервалы?

я использую

varName = setInterval(function() { ... }, 1000);

установить пару интервалов в плагине 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();

И я попытался убить эти интервалы в функции base.init(), например:

clearInterval(transitionInterval);
clearInterval(mainInterval);

А вот так:

window.oldSetInterval = window.setInterval;
window.setInterval = new function(func, interval) {  }

Ответ 1

Вы могли бы сделать,

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

Ответ 2

Храните их в объекте. Поскольку вы делаете эти интервалы только вы и знаете, что это такое, вы можете хранить их, а потом связываться с ними по своему усмотрению. Я бы создал объект, предназначенный только для этого, что-то вроде:

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);
        }
    }
};

Ваш первый вопрос может быть

Зачем делать отдельный объект только для этого?

Ну что ж, Уотсон, чтобы ваши ручные интервалы, связанные с вашим плагином/проектом, не попадали под любопытные глаза, поэтому вы не будете связываться с другими интервалами, установленными на странице, не связанной с вашим плагином.

Да, но почему я не могу хранить его внутри базового объекта?

Вы наверняка можете, но я думаю, что этот способ намного чище. Он разделяет логику, которую вы делаете в своей базе, со странной логикой тайм-аута.

Почему вы хранили интервалы внутри набора, а не массива?

Более быстрый доступ и немного более чистого кода. Вы можете пойти любым путем, правда.

Ответ 3

Запустите Таймер и установите его как объект окна. Window.myInterval будет содержать идентификатор таймера.

например, window.myInterval = setInterval(function() { console.log('hi'); }, 1000);

Чтобы очистить интервал вы можете написать как

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

Ответ 4

Это решение должно быть сделано в полном объеме: например, апелляция по решению суда:

if(typeof(val) == 'v' != undefined){
    clearInterval(v);
}
v=setInterval(function(){ FONCTION A AXECUTER TOUTES LES SECONDES }, 1000);

Dans La Fonction Applée Sur Onmouseout:

if(typeof(val) == 'v' != undefined){
    clearInterval(v);
}

Testé sur plusieurs штурман, новый никель!