J'utilise
varName = setInterval(function() { ... }, 1000);
pour définir quelques intervalles dans un plugin jquery que j'écris, mais lorsque le plugin est rechargé, je dois effacer ces intervalles. J'ai essayé de les stocker dans des variables, comme ceci:
(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();
Et j'ai essayé de tuer ces intervalles dans la fonction base.init (), comme ceci:
clearInterval(transitionInterval);
clearInterval(mainInterval);
Et comme ça:
window.oldSetInterval = window.setInterval;
window.setInterval = new function(func, interval) { }
Vous pourriez faire comme,
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
Rangez-les dans un objet. Puisque vous êtes le seul à faire ces intervalles et que vous savez ce qu'ils sont, vous pouvez les stocker et les jouer plus tard comme vous le souhaitez. Je créerais un objet dédié à cela, quelque chose comme:
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);
}
}
};
Votre première question pourrait être
Pourquoi faire un objet séparé juste pour ça?
Eh bien Watson, c'est pour garder vos intervalles faits à la main liés à votre plugin/projet à l'abri des regards indiscrets, afin de ne pas jouer avec d'autres intervalles définis dans la page non liés à votre plugin.
Oui, mais pourquoi ne puis-je pas le stocker à l'intérieur de l'objet de base?
Vous le pouvez très certainement, mais je pense que cette façon est beaucoup plus propre. Il sépare la logique que vous faites dans votre base avec la logique de temporisation étrange.
Pourquoi avez-vous stocké les intervalles dans un Set et non dans un tableau?
Un accès plus rapide et un peu de code plus propre. Vous pouvez vraiment aller dans les deux sens.
Initialisez la minuterie et définissez-la comme objet fenêtre. Window.Interval contiendra l'ID de la minuterie.
comme window.myInterval = setInterval(function() { console.log('hi'); }, 1000);
Pour effacer l'intervalle, vous pouvez écrire comme
if(window.myInterval != undefined && window.myInterval != 'undefined'){
window.clearInterval(window.myInterval);
alert('Timer cleared with id'+window.myInterval);
}