如何清除所有间隔?

新手上路,请多包涵

我在用

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

原文由 Nikolay Dyankov 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 407
2 个回答

您可以通过创建一个“什么都不做”的新计时器(通过给它一个空函数来运行,计划在未来几十年运行)来找到“最高”计时器标识符,然后清除 ids 1 和该标识符之间的每个计时器,像这样:

 // Get a reference to the last interval + 1
const interval_id = window.setInterval(function(){}, Number.MAX_SAFE_INTEGER);

// Clear any timeout/interval up to that id
for (let i = 1; i < interval_id; i++) {
  window.clearInterval(i);
}

但是,请注意,这并不能 保证 有效:HTML 标准 实际上并未规定 如何分配超时/间隔标识符,因此我们将获得对“最后间隔标识符 + 1”的引用的假设仅仅是:假设。在回答这个问题时对于大多数浏览器来说可能是正确的,但不能 保证 即使在同一浏览器的下一个版本中仍然如此。

原文由 Sudhir Bastakoti 发布,翻译遵循 CC BY-SA 4.0 许可协议

将它们存储在一个对象中。由于您是唯一一个制定这些间隔的人,并且您知道它们是什么,因此您可以存储它们并在以后随意使用它们。我会创建一个专用于此的对象,例如:

 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.intervals.delete(id);
        return clearInterval(id);
    },

    // clear all intervals
    clearAll() {
        for (var id of this.intervals) {
            this.clear(id);
        }
    }
};

你的第一个问题可能是

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

Well Watson,这是为了让您手工制作的与您的插件/项目相关的间隔远离窥探,这样您就不会混淆页面中设置的与您的插件无关的其他间隔。

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

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

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

更快的访问速度和更简洁的代码。你可以走任何一条路,真的。

原文由 Zirak 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题