2016-09-25 124 views
0

我想清除每15秒運行的時間間隔。爲什麼setInterval函數不能停止?

這裏是Ajax請求:

function extras() 
{ 
    $x = { 
     action:'extras' 
    }; 
    var r; 
    $.ajax({ 
     type:'POST', 
     url:'services.php', 
     data:$x, 
     beforeSend:function() { 
      $('input[name="stop_"]').trigger("click"); 
     }, 
     success:function(response) { 
      r = response; 
      //console.log(response) 
     }, 
     complete:function() { 
      console.log(r);     
      $('input[name="re_start"]').trigger("click"); 
     } 
    }); 
} 

所以,在我的按鈕re_startstop_我有:

$('input[name="re_start"]').click(function (event) { 
    event.preventDefault(); 
    clearInterval(check); 
    var check = setInterval(function() { 
     extras(); 
    },15000); 
    console.log('Starting again...'); 
}); 

$('input[name="stop_"]').click(function (event) { 
    event.preventDefault(); 
    clearInterval(check); 
    console.log('Stop'); 
}); 

在我的jQuery的DOM我初始化功能extras()並保持在一個名爲「檢查」的變量,其中我初始化時間間隔如下:

<input type="button" style="display:none;" name="re_start"> 
<input type="button" style="display:none;" name="stop_"> 

<script type="text/javascript"> 
    (function() { 
     extras(); 
     var check = setInterval(function() { 
      extras(); 
     },15000); 
    })(); 
    function extras() 
    { 
     $x = { 
      action:'extras' 
     }; 
     var r; 
     $.ajax({ 
      type:'POST', 
      url:'services.php', 
      data:$x, 
      beforeSend:function() { 
       $('input[name="stop_"]').trigger("click"); 
      }, 
      success:function(response) { 
       r = response; 
       //console.log(response) 
      }, 
      complete:function() { 
       console.log(r); 
       //message_smart(r);      
       $('input[name="re_start"]').trigger("click"); 
      } 
     }); 
    } 
</script> 

然後我無法理解前30秒是如何工作的,當他們通過60秒時,似乎開始一次做兩次,然後三次,等等!看來,如果我每隔一段時間更改一次,運行速度會更快,速度更快。問題是什麼?

+3

'check'不在第二點擊處理程序的範圍內... – Li357

+0

感謝您的回答。你怎麼知道?我的意思是,當AJAX在完整的函數完成並且beforeSend我停止最後一個setInterval時,我重新啓動我的setInterval。 –

回答

3

的問題是在這裏:

(function() { 
    extras(); 
    var check = setInterval(function() { 
     extras(); 
    },15000); 
})(); 

你正在創造一個新的功能範圍不能接近該範圍之外的變量checkMicrosoft在javascript中有一個很好的示例範圍。另外你可以看到this question

現在要解決您的問題,您需要將check變量放在全局範圍中,以便刪除函數包裝器。

extras(); 
var check = setInterval(function() { 
    extras(); 
},15000); 

您還需要更改重新啓動處理程序,以重新分配變量,像這樣:

$('input[name="re_start"]').click(function (event) { 
    event.preventDefault(); 
    clearInterval(check); 
    check = setInterval(function() { 
     extras(); 
    },15000); 
    console.log('Starting again...'); 
}); 

現在他們都應該使用相同的check變量和工作清除超時時預期。

+0

非常感謝。我從來沒有想到問題出現在全局變量中。我的問題解決了。問候。 –