【问题标题】:How to clear interval and set it again?如何清除间隔并重新设置?
【发布时间】:2012-06-07 15:33:59
【问题描述】:

这就是我想要完成的事情:当到达最后一张幻灯片时,淡出最后一张幻灯片,然后淡入第一张幻灯片,然后 clearInterval (一切都适用于这部分)。现在我的问题是,如果 setInterval 不存在但我不知道如何实现它,我想 再次 设置它:(
我试图用 if 语句解决这个问题,但后来我的脚本根本不起作用!
那么我怎样才能重新开始我的间隔?谢谢!
没有这样的 if 语句它工作正常:

if(!intervalID){
    intervalID = setInterval(animate,5000);
}    

这是我目前所拥有的:

$(document).ready(function() {
  /*check if intervalID don't exists messes UP!!*/
  if (!intervalID) {
    intervalID = setInterval(animate, 5000);
  }

  //Hide everything except first slide and controls

  $('.slidewrap div:not(.slidewrap div:first,.slidewrap .slide_controls)').hide();

  var animate = function() {

    /*if .pagination_active is last removeClass and addClass to .pagination_active 
             first li tag*/

    if ($('.pagination_active').is($('.slide_controls ul li:last'))) {
      $('.pagination_active').removeClass('pagination_active');
      $('.slide_controls ul li:first').addClass('pagination_active');
    } else {
      $('.pagination_active').removeClass('pagination_active').next().addClass('pagination_active');
    }

    /*if div.active is last fadeOut and add .active class 
             to the first div and fadeIn FIRST div then CLEAR INTERVAL and set intervalID to zero */

    if ($('.active').is($('.slidewrap div:last'))) {
      $('.active').fadeOut(1000).removeClass('active');
      $('.slidewrap div:first').addClass('active').fadeIn(1000, function() {
        clearInterval(intervalID);
        intervalID = 0;

      });
    }

    //OR .active fadeOut and next div fadeIn
    else {
      $('.active').fadeOut(1000).next().fadeIn(1000, function() {
        $('.slidewrap div.active').removeClass('active').next('div').addClass('active');

      });
    }

  }

  var intervalID;
  intervalID = setInterval(animate, 3000);

});

【问题讨论】:

  • 无法重启;已清除,已删除。您可以做的是使用相同的功能开始一个新的间隔。 ——
  • @Blazemonger 先生,您正在编辑我的帖子,同时也在编辑我。所以我失去了你宝贵的编辑。如果您觉得有必要,您可以编辑我的答案,我会很高兴

标签: javascript jquery


【解决方案1】:

只是示例

var myVar 
function myTimer() {
    var d = new Date();
    var t = d.toLocaleTimeString();
    document.getElementById("demo").innerHTML = t;
}

function myStopFunction() {
    clearInterval(myVar);
}
function myStartFunction() {
    myVar = setInterval(myTimer, 1000);
}
myStartFunction();
<p id="demo"></p>
<button onclick="myStopFunction()">Stop time</button>
<button onclick="myStartFunction()">Start time</button>

【讨论】:

    【解决方案2】:

    清除间隔后,您需要使用setInterval() 重新启动它。

    最好为你的setInterval()做功能

    var intervalID = null;
    
    function intervalManager(flag, animate, time) {
       if(flag)
         intervalID =  setInterval(animate, time);
       else
         clearInterval(intervalID);
    }
    

    这里的flag 是一个boolean 变量,其值为true/ falsetrue 将执行 setInterval()false 将执行 clearInterval();

    现在您可以根据需要使用上述功能了。

    例如:

    intervalManager(true, animate, 300);  // for setInterval
    
    intervalManager(false);  // for clearInterval
    

    【讨论】:

    • 您无法重新启动已被清除的间隔。但是你为什么不干脆开始一个新的呢?
    • 感谢您的时间和答案!我很感激!
    【解决方案3】:

    计时器的解决方案计数 15 秒然后转到主页,如果点击屏幕将计时器重置为开始。它可能对某人有用。 (x 是触摸事件的计数器):

      var productInterval = null;
      var counterForGoToMainPage = 15;
    
      function startTimer(){
        counterForGoToMainPage--;
    
        if(counterForGoToMainPage == 0){
          clearInterval(productInterval);
          counterForGoToMainPage = 15;
          window.location.href = "/";
          }
      }
    
      function countTouches(event) {
      var x = event.touches.length;
    
        if(x == 1) { 
          clearInterval(productInterval);
          counterForGoToMainPage = 15;
          productInterval = setInterval(function(){
             startTimer();
          },1000);
        }
      }
    

    【讨论】:

      【解决方案4】:

      这是一个实用对象,它接受一个回调和间隔,您可以使用它来启动和停止一个间隔。

         //simple utility object to start and stop an interval       
          var IntervalUtil = function(functionCall, interval){
      
      
              var intervalObj = 0,
                  INTERVAL    = interval;
      
              var callback = functionCall;
      
              function startTimer(){
                  console.log('start timer', intervalObj)
                  if(intervalObj === 0){
                      intervalObj = setInterval(callback, INTERVAL)
                  }
              }   
      
              function stopTimer(){
                  clearInterval(intervalObj);
                  intervalObj = 0;
                  console.log('timer stopped', intervalObj);
              }
      
              return {
                  startTimer : startTimer,
                  stopTimer  : stopTimer
              }
      
          };  
      

      *你会这样使用它 *

      <html>
      <head>
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
          <meta name="author" content=""/>
      
          <title>Timer : setInterval()</title> 
      
      
          <style type="text/css">
      
      
          html, body, div, span, applet, object, iframe,
          h1, h2, h3, h4, h5, h6, p, blockquote, pre,
          a, abbr, acronym, address, big, cite, code,
          del, dfn, em, img, ins, kbd, q, s, samp,
          small, strike, strong, sub, sup, tt, var,
          b, u, i, center,
          dl, dt, dd, ol, ul, li,
          fieldset, form, label, legend,
          table, caption, tbody, tfoot, thead, tr, th, td,
          article, aside, canvas, details, embed, 
          figure, figcaption, footer, header, hgroup, 
          menu, nav, output, ruby, section, summary,
          time, mark, audio, video {
              margin: 0;
              padding: 0;
              border: 0;
              font-size: 100%;
              color:#000;
              line-height:1.3em;
              font: inherit;
              vertical-align: middle;
              font-family:arial;
              font-size:12px;
              outline:none;
          }
      
          a{
              outline:none;
              text-decoration:none;
              color:#145486;
          }
          a span{
              color:#145486;
          }
      
          h1{
              font-weight:normal;
              font-size:32px;
          }
      
          body{
              background:#efefef;
              text-align:center;
          }
          .content{
              width:400px;
              padding:20px;
              margin:10px auto;
              background:#fff;
              border:solid 1px #ebebeb;
              text-align:left;
          }
      
          #toggleTimer{
              color:#fff;
              font-size:10px;
              padding:2px 7px;
              display:inline-block;
              background:#357cb7;
              border:solid 1px #0c8af4;
          }
      
          #toggleTimer.running{
              background:#f14621;
              border:solid 1px #ff4c00;
          }
      
          #output{
              padding:7px;
              font-size:10px;
              border:dashed 1px #ebebeb;
              background:#f8f8f8;
              margin-left:10px;
              display:inline-block;
          }
          em{
              font-weight:bold;
          }
      
          </style>
      
      </head>
      <body>
      
      
      <div class="content">
      
          <h1>Set Interval Code</h1>
      
          <a href="javascript:" id="toggleTimer" class="">Start Timer</a>
      
          <span id="output"></span>
      
          <br class="clear"/>
      
      </div>
      
      
      <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
      
      
      <script type="text/javascript">
      
          $(document).ready(function(){
              var demo = new Demo();
          });
      
      
          var Demo = function(){
      
              var self = this;
      
              var START_TEXT = "Start Timer",
                  STOP_TEXT  = "Stop Timer";
      
              var $toggle = $('#toggleTimer'),
                  $output = $('#output');
      
              var count = 0;
      
              var intervalUtil;
      
              function init(){
                  intervalUtil = new IntervalUtil(printMessage, 1000);
                  setClickHandler();
                  return self;
              }   
      
              function setClickHandler(){
                  $toggle.click(toggleTimer)
              }
      
              function toggleTimer(){
      
                  $toggle.toggleClass('running');
      
                  if($toggle.hasClass('running')){
                      $toggle.text(STOP_TEXT);
                      intervalUtil.startTimer();
                  }else{
                      $toggle.text(START_TEXT);
                      intervalUtil.stopTimer();
                  }
              }
      
              function printMessage(){        
                  $output.html("printMessage called <em>" + (count++) + "</em> times");
              }
      
              return init();
      
          }
      
      
          //simple utility object to start and stop an interval       
          var IntervalUtil = function(functionCall, interval){
      
      
              var intervalObj = 0,
                  INTERVAL    = interval;
      
              var callback = functionCall;
      
              function startTimer(){
                  console.log('start timer', intervalObj)
                  if(intervalObj === 0){
                      intervalObj = setInterval(callback, INTERVAL)
                  }
              }   
      
              function stopTimer(){
                  clearInterval(intervalObj);
                  intervalObj = 0;
                  console.log('timer stopped', intervalObj);
              }
      
              return {
                  startTimer : startTimer,
                  stopTimer  : stopTimer
              }
      
          };  
      
      </script>
      
      
      </body>
      </html>
      

      【讨论】:

        【解决方案5】:

        在我的项目中(使用Sveltekit),我了解到您可以在函数中使用letsetIntervalclearInterval 之间循环来定义NodeJS 计时器:

        $: number = 0 //The "$" sign, in this case, is used to a make reactive statement 
        
        const changeValue = (e: any) => {
            let changingValue = setInterval(() => {
                number += 0.01
                if (number >= 0.2) {
                    clearInterval(changingValue)
                }
            }, 4)
        }, 
        changeValueAgain = (e: any) => {
            let changingValue = setInterval(() => {
                number -= 0.01
                if (number <= 0) {
                    clearInterval(changingValue)
                }
            }, 4)
        }
        

        (顺便说一下,我使用的是 Typescript) 很简单,每次调用函数时,它都会创建一个新的 NodeJS 计时器,当某些条件为真时会被清除

        e 参数用于事件处理程序...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-09
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多