javascript - 带按键暂停的 setTimeout 函数重载
问题描述
嗨,我有一个功能是使用计时器重新加载 div 中的消息。我尝试了所有可能的方法,我可以让我的头脑有一个稳定的计时器,但几乎每次尝试都会让计时器最大化运行多次,而不是每 4 秒稳定 1 次。我看不出我做错了什么。
计时器一直在工作,直到我按下一个键,然后在计时器重新启动后,我在控制台输出中运行了多个计时器。
任何人都可以帮助指导我找到一个可行的模型。
谢谢你。
这是代码。
$(window.ready = function(){
var ticker = function (){
var varLISTID = "<?php echo $listID; ?>";
var varUSERACCOUNTNAME = "<?php echo $useraccountname; ?>";
var varITEMACCOUNTNAME = "<?php echo $itemaccountname; ?>";
var varSELECTEDUSER=document.getElementById('datacatchuser').getAttribute("data-variable-SELECTEDUSER");
var mybutton= "messageboxreplybutton.php?listID=" + varLISTID + "&useraccountname=" + varUSERACCOUNTNAME + "&itemaccountname=" + varITEMACCOUNTNAME + "&selecteduser=" + varSELECTEDUSER;
$('#buttonbox').load(mybutton);
var mylink = "loadmessages.php?listID=" + varLISTID + "&useraccountname=" + varUSERACCOUNTNAME + "&itemaccountname=" + varITEMACCOUNTNAME + "&selecteduser=" + varSELECTEDUSER;
$('#infobox1').load(mylink);
var myotherlink = "contactselect.php?listID=" + varLISTID + "&useraccountname=" + varUSERACCOUNTNAME + "&itemaccountname=" + varITEMACCOUNTNAME + "&selecteduser=" + varSELECTEDUSER;
$('#containercontact').load(myotherlink);
console.log('running');
};//10s
var myTimer = window.setTimeout(ticker, 4000);
//stops running until ???
$(document).keypress(function() {
window.clearInterval(myTimer);
setTimeout( function(){
var myTimer = window.setTimeout(ticker, 4000);
},4000)
})
});
解决方案
当您创建一个变量(第二次)时
var myTimer = window.setTimeout(ticker, 4000);
在函数内部,您创建了该函数的局部新变量,稍后可以访问该变量,因此您无法清除它。这就是为什么您最终会使用多个正在运行的计时器。如果您只使用一个指向当前运行间隔的变量,则可以在开始另一个变量之前将其清除:
function ticker() {
console.log("timer fired")
}
var myTimer = setInterval(ticker, 1000);
//stops running until ???
$(document).keypress(function() {
console.log("clearing")
clearInterval(myTimer);
// don't use var, just access the existing variable from the parent scope.
myTimer = setInterval(ticker, 1000);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
只运行一次,除非有按键,否则只需替换setInterval
为setTimeout
. 这将设置一个 4 秒的计时器。如果有按键,它将取消第一个超时并重置另一个。
function ticker() {
console.log("timer fired")
}
var myTimer = setTimeout(ticker, 4000);
//stops running until ???
$(document).keypress(function() {
console.log("resetting timeout")
clearTimeout(myTimer);
// don't use var, just access the existing variable from the parent scope.
myTimer = setTimeout(ticker, 4000);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
推荐阅读
- ios - 为什么调度组不等待?
- unity3d - Unity3d - 什么是 linecast hit.normal
- python - 如果另一个 DEF 不起作用,如何运行一个 DEF 以及如何构建它?
- arrays - 对包含在数组中的字典进行排序
- html - 将第二个垫子工具栏放在主垫子工具栏下?
- python - 气流 BashOperator 在 Python 脚本之间传递参数
- vba - 查找匹配的重复项并为每个项涂上不同的颜色
- c - 查找数组中随机数的频率
- android - Xamarin.Android 中的 java.lang.IllegalStateException onCreate 活动
- python-3.x - anaconda 和 VScode 的问题