Piszę aplikację, która używa limitów czasu i interwałów JavaScript do aktualizacji strony. Czy istnieje sposób, aby sprawdzić, ile przedziałów czasu zostało skonfigurowanych? Chcę się upewnić, że przypadkowo nie zabiję przeglądarki, ustawiając setki interwałów.
Czy to w ogóle problem?
javascript
timeout
setinterval
Omar Kooheji
źródło
źródło
activeTimers
zmniejszyć, gdy nieclearTimeout
został wywołany. Można to łatwo osiągnąć, zastępując drugą linię tym:window.setTimeout
return window.originalSetTimeout(function() {func(); activeTimers--;},delay);
Zrobiłem rozszerzenie Chrome DevTools, które pokazuje wszystkie interwały. Wyczyszczone są wyszarzone.
setInterval-sniffer
źródło
Widząc, że Paul opisał tylko setTimeout, pomyślałem, że udostępnię licznik dla 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); };
źródło
Zamiast po prostu mieć liczbę timerów, tutaj jest implementacja, która przechowuje wszystkie identyfikatory timerów w tablicy. Pokazuje tylko aktywne liczniki, podczas gdy zaakceptowana odpowiedź liczy tylko połączenia z
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));
W ten sposób możesz uzyskać liczbę aktywnych timerów na stronie:
Oto jak możesz usunąć wszystkie aktywne timery :
for(var i = timers.length; i--;) clearInterval(timers[i]);
Znane ograniczenia:
setTimeout
pomocą tej małpy.clearInterval
iclearTimeout
robi to samo, co robią, ale może to zmienić w przyszłości.źródło
SetIntervals
? Na przykładvar timer = setInterval(function () { }
potrzebuję timera zamiast liczenia interwałów biegania.Właśnie opublikowaliśmy pakiet rozwiązujący dokładnie ten problem.
Dzięki temu możesz przeglądać je i zarządzać nimi za pośrednictwem
timeoutCollection
obiektu (i interwałów JavaScript za pośrednictwemintervalCollection
obiektu).timeoutCollection.getScheduled(); timeoutCollection.getCompleted(); timeoutCollection.getAll();
źródło
Po prostu potrzebowałem czegoś takiego i oto co złożyłem:
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);
Zapisuje przedziały czasu
id
wraz z ich funkcjami, a także śledzi ich status (active
/inactive
).źródło