How to clearInterval with unknown ID?

前端 未结 4 1745
眼角桃花
眼角桃花 2020-11-29 04:30

Say someone (evil) has set us a timer with setInterval, but we don\'t know its ID (we don\'t have the reference to the object, that setInterval is returning, no

相关标签:
4条回答
  • 2020-11-29 05:08

    I tried the approach suggested by #Shadow Wizard and it worked in clearing the interval. However, this approach had side effects afterwards. In my particular case, I was unable use jquery.fadeTo() after clearing all of the intervals.

    The approach that I settled on is a cleaner solution, which is to redefine the setInterval method and save the interval ids in the re-defined methods. As shown here, I put the the ids into an array and then clear all of them. With a little more refinement of the structure to store the arrays, you could label them and clear them selectively.

    var intervalTracking = new Array();
    var intervalCount=0;
    
    window.oldSetInterval = window.setInterval;
    window.setInterval = ( function(func, interval) {
        var interval = oldSetInterval(func, interval);
        intervalTracking[++intervalCount]=interval;
        return interval;
    });
    
    function clearAllIntervals() {
        for (var i = 0 ; i <= intervalCount ; i++) {
        window.clearInterval( intervalTracking[i] );
        }
    }
    

    This seems to work!

    0 讨论(0)
  • 2020-11-29 05:16

    I solved it by using localstorage, saving there the id of the setInterval, and picking up it later in order to clear that interval..

    0 讨论(0)
  • 2020-11-29 05:18

    From quick test, all major browsers (latest Chrome, Firefox and IE) give pretty small numbers as the ID so just looping "blindly" over all possible numbers should work just fine:

    function ClearAllIntervals() {
        for (var i = 1; i < 99999; i++)
            window.clearInterval(i);
    }
    

    Full example:

    window.onload = function() {
        window.setInterval(function() {
            document.getElementById("Tick").innerHTML += "tick<br />";
        }, 1000);
        window.setInterval(function() {
            document.getElementById("Tack").innerHTML += "tack<br />";
        }, 1000);
    };
    
    function ClearAllIntervals() {
        for (var i = 1; i < 99999; i++)
            window.clearInterval(i);
    }
    #Placeholder div { width: 80px; float: left; }
    <button type="button" onclick="ClearAllIntervals();">Clear All</button>
    <div id="Placeholder">
        <div id="Tick"></div>
        <div id="Tack"></div>
    </div>

    This will stop all intervals, can't stop specific interval without knowing its ID of course.

    As you can test for yourself, it should work on all major browsers mentioned above.

    0 讨论(0)
  • 2020-11-29 05:31

    Well, empirically trials in Chrome show that setInterval returns a number which increments for each call. So if you are SURE that you setInterval was the last one set the following would work :

    function clearLastInterval () {
      var i = setInterval (function () {}, 10000);
      clearInterval (i-1);
      clearInterval (i);
    }
    

    I'm not sure I would recommend this though ;-)

    0 讨论(0)
提交回复
热议问题