查看JavaScript中的所有超时/时间间隔?


Answers:


76

我认为没有办法枚举活动计时器,但是您可以覆盖window.setTimeoutwindow.clearTimeout与自己的实现其做一些跟踪,然后调用原件替换它们。

window.originalSetTimeout = window.setTimeout;
window.originalClearTimeout = window.clearTimeout;
window.activeTimers = 0;

window.setTimeout = function(func, delay) {
    window.activeTimers++;
    return window.originalSetTimeout(func, delay);
};

window.clearTimeout = function(timerID) {
    window.activeTimers--;
    window.originalClearTimeout(timerID);
};

当然,您不一定总是调用clearTimeout,但这至少可以为您提供某种方式来跟踪运行时发生的情况。


3
今天笔者在一些代码中使用这个,但我需要activeTimers递减的时候clearTimeout不是叫。通过用以下代码替换第二行即可轻松实现window.setTimeoutreturn window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Rick Hitchcock

2
由于与DOM相关的JavaScript函数将是“不可变的”,因此该答案将不再起作用。
John Greene


11

看到Paul只讲了setTimeout,我想我应该为setInterval / clearInterval共享一个计数器。

window.originalSetInterval = window.setInterval;
window.originalClearInterval = window.clearInterval;
window.activeIntervals = 0;
window.setInterval = function (func, delay)
{
    if(func && delay){
            window.activeIntervals++;
    }
    return window.originalSetInterval(func,delay);
};
window.clearInterval = function (intervalId)
{
    // JQuery sometimes hands in true which doesn't count
    if(intervalId !== true){
        window.activeIntervals--;
    }
    return window.originalClearInterval(intervalId);
};

9

这是一个将所有timerid都存储到一个数组中的实现,而不是只包含一个计时器。它仅显示活动的计时器,而接受的答案仅计算对setTimeout&的呼叫clearTimeout

(function(w) {
    var oldST = w.setTimeout;
    var oldSI = w.setInterval;
    var oldCI = w.clearInterval;
    var timers = [];
    w.timers = timers;
    w.setTimeout = function(fn, delay) {
        var id = oldST(function() {
            fn && fn();
            removeTimer(id);
        }, delay);
        timers.push(id);
        return id;
    };
    w.setInterval = function(fn, delay) {
        var id = oldSI(fn, delay);
        timers.push(id);
        return id;
    };
    w.clearInterval = function(id) {
        oldCI(id);
        removeTimer(id);
    };
    w.clearTimeout = w.clearInterval;

    function removeTimer(id) {
        var index = timers.indexOf(id);
        if (index >= 0)
            timers.splice(index, 1);
    }
}(window));

这是在页面上获取活动计时器计数的方法

timers.length;

这是删除所有活动计时器的方法

for(var i = timers.length; i--;)
    clearInterval(timers[i]);

已知限制:

  • 您只能setTimeout将此函数(而不是字符串)传递给此猴子补丁。
  • 该函数假定clearIntervalclearTimeout执行相同的操作,但将来可能会发生变化。

是否可以获取所有正在运行的名称SetIntervals?例如,var timer = setInterval(function () { }我需要计时器而不是运行间隔计数。
Yogesh Patel's

并不是我所知道的,我建议通过关键字“ setInterval”和/或“ setTimeout”进行全局搜索
Carles Alcolea,

4

我们刚刚发布了解决此确切问题的软件包。

npm install time-events-manager

这样,您可以通过timeoutCollection对象查看和管理它们(并通过对象来查看javascript的间隔intervalCollection)。

timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();


2
我认为OP和大多数人都在寻找可以在浏览器控制台中键入的内容作为第一个PoC,然后可能在扩展中输入。从您提供的信息来看,如何将其放入控制台?
卡尔斯·阿尔科利亚

1

我只需要像这样的东西,这就是我放在一起的东西:

window.setInterval = function (window, setInterval) {
  if (!window.timers) {
    window.timers = {};
  }
  if (!window.timers.intervals) {
    window.timers.intervals = {};
  }
  if (!window.timers.intervals.active) {
    window.timers.intervals.active = {};
  }
  return function (func, interval) {
    var id = setInterval(func, interval);
    window.timers.intervals.active[id] = func;
    return id;
  }
}(window, window.setInterval);

window.clearInterval = function (window, clearInterval) {
  if (!window.timers) {
    window.timers = {};
  }
  if (!window.timers.intervals) {
    window.timers.intervals = {};
  }
  if (!window.timers.intervals.inactive) {
    window.timers.intervals.inactive = {};
  }
  return function (id) {
    if (window.timers.intervals.active && window.timers.intervals.active[id]) {
      window.timers.intervals.inactive[id] = window.timers.intervals.active[id];
      clearInterval(id);
      delete window.timers.intervals.active[id];
    }
  }
}(window, window.clearInterval);

这将记录间隔ids及其功能,并跟踪其状态(active/ inactive)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.