【问题标题】:How do I clear this setInterval inside a function?如何在函数内清除此 setInterval?
【发布时间】:2011-02-23 11:20:59
【问题描述】:

通常,我会将间隔设置为一个变量,然后像 var the_int = setInterval(); clearInterval(the_int); 一样将其清除,但为了让我的代码能够正常工作,我将它放在一个匿名函数中:

function intervalTrigger() {
  setInterval(function() {
    if (timedCount >= markers.length) {
      timedCount = 0;
    }

    google.maps.event.trigger(markers[timedCount], "click");
    timedCount++;
  }, 5000);
};

intervalTrigger();

我该如何清除这个?我试了一下,并尝试var test = intervalTrigger(); clearInterval(test); 确定,但没有奏效。

基本上,一旦我的谷歌地图被点击,我需要这个停止触发,例如

google.maps.event.addListener(map, "click", function() {
  //stop timer
});

【问题讨论】:

    标签: javascript settimeout dom-events


    【解决方案1】:

    setInterval 方法返回一个句柄,您可以使用该句柄来清除间隔。如果你想让函数返回它,你只需返回方法调用的结果:

    function intervalTrigger() {
      return window.setInterval( function() {
        if (timedCount >= markers.length) {
           timedCount = 0;
        }
        google.maps.event.trigger(markers[timedCount], "click");
        timedCount++;
      }, 5000 );
    };
    var id = intervalTrigger();
    

    然后清除间隔:

    window.clearInterval(id);
    

    【讨论】:

    • 注意:您不需要引用全局范围。 setIntervalwindow.setInterval 一样好用。
    • 明确表达通常是个好习惯。一些 linter 会抱怨隐式使用全局范围,而 window. 可以。
    【解决方案2】:
    // Initiate set interval and assign it to intervalListener
    var intervalListener = self.setInterval(function () {someProcess()}, 1000);
    function someProcess() {
      console.log('someProcess() has been called');
      // If some condition is true clear the interval
      if (stopIntervalIsTrue) {
        window.clearInterval(intervalListener);
      }
    }
    

    【讨论】:

      【解决方案3】:
      the_int=window.clearInterval(the_int);
      

      【讨论】:

        【解决方案4】:

        我能想到的最简单的方法:添加一个类。

        只需添加一个类(在任何元素上)并检查区间内是否存在。我相信,这比任何其他方式都更可靠、更可定制和跨语言。

        var i = 0;
        this.setInterval(function() {
          if(!$('#counter').hasClass('pauseInterval')) { //only run if it hasn't got this class 'pauseInterval'
            console.log('Counting...');
            $('#counter').html(i++); //just for explaining and showing
          } else {
            console.log('Stopped counting');
          }
        }, 500);
        
        /* In this example, I'm adding a class on mouseover and remove it again on mouseleave. You can of course do pretty much whatever you like */
        $('#counter').hover(function() { //mouse enter
            $(this).addClass('pauseInterval');
          },function() { //mouse leave
            $(this).removeClass('pauseInterval');
          }
        );
        
        /* Other example */
        $('#pauseInterval').click(function() {
          $('#counter').toggleClass('pauseInterval');
        });
        body {
          background-color: #eee;
          font-family: Calibri, Arial, sans-serif;
        }
        #counter {
          width: 50%;
          background: #ddd;
          border: 2px solid #009afd;
          border-radius: 5px;
          padding: 5px;
          text-align: center;
          transition: .3s;
          margin: 0 auto;
        }
        #counter.pauseInterval {
          border-color: red;  
        }
        <!-- you'll need jQuery for this. If you really want a vanilla version, ask -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        
        
        <p id="counter">&nbsp;</p>
        <button id="pauseInterval">Pause/unpause</button></p>

        【讨论】:

          猜你喜欢
          • 2021-12-15
          • 2012-08-19
          • 1970-01-01
          • 1970-01-01
          • 2020-01-12
          • 2010-10-31
          • 2019-07-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多