Javascript 我对setTimeout/clearTimeout有问题

Javascript 我对setTimeout/clearTimeout有问题,javascript,Javascript,我有以下几点 document.addEventListener(“DOMContentLoaded”,function()){ document.querySelector(“#pageRedirect”).addEventListener(“更改”,changeHandler); }); 函数changeHandler(){ 无功定时器; 如果(pageRedirect.checked){ 计时器=设置超时(函数(){ window.location.href=http://www.goo

我有以下几点

document.addEventListener(“DOMContentLoaded”,function()){
document.querySelector(“#pageRedirect”).addEventListener(“更改”,changeHandler);
});
函数changeHandler(){
无功定时器;
如果(pageRedirect.checked){
计时器=设置超时(函数(){
window.location.href=http://www.google.com';
}, 3000);
console.log(pageRedirect.checked);
}否则{
//不要重定向
清除超时(计时器);
console.log(pageRedirect.checked);
}
}

问题在于计时器ID变量声明的位置。它在函数内部,因此当您试图清除它时,它没有得到您在
设置超时中指定的ID。您需要将声明移到函数之外,以便在调用之间保留计时器的句柄:

var timer;
function changeHandler(){
    // etc
这是由for
clearTimeout
构成的,其中表示:

如果handle未在调用该方法的WindowTimers对象的活动超时列表中标识条目,则该方法不执行任何操作


也就是说,它将默默地忽略任何无效的计时器句柄,在您的情况下,这将是
未定义的

问题是计时器ID的变量声明的位置。它在您的函数中,因此当您尝试清除它时,它没有您在
setTimeout
中指定的ID。您需要将声明移到函数之外,以便在调用之间保留计时器的句柄:

var timer;
function changeHandler(){
    // etc
这是由for
clearTimeout
构成的,其中表示:

如果handle未在调用该方法的WindowTimers对象的活动超时列表中标识条目,则该方法不执行任何操作


也就是说,它将默默地忽略任何无效的计时器句柄,在您的情况下,这将是
未定义的

问题是
计时器
变量在每次函数执行时都会重新声明,因此即使有闭包,变量也不会保留计时器

您可以将计时器存储在其他地方,如节点中。注意,在下面的代码片段中,我将计时器存储在this.timer中

document.addEventListener(“DOMContentLoaded”,函数(){
document.querySelector(“#pageRedirect”).addEventListener(“更改”,changeHandler);
});
函数changeHandler(){
如果(pageRedirect.checked){
this.timer=setTimeout(函数(){
document.getElementById('output').innerHTML=“完成”;
}, 3000);
}否则{
//不要重定向
clearTimeout(this.timer);
}
}

问题在于每次函数执行时都会重新声明
计时器
变量,因此即使有闭包,变量也不会保留计时器

您可以将计时器存储在其他地方,如节点中。注意,在下面的代码片段中,我将计时器存储在this.timer中

document.addEventListener(“DOMContentLoaded”,函数(){
document.querySelector(“#pageRedirect”).addEventListener(“更改”,changeHandler);
});
函数changeHandler(){
如果(pageRedirect.checked){
this.timer=setTimeout(函数(){
document.getElementById('output').innerHTML=“完成”;
}, 3000);
}否则{
//不要重定向
clearTimeout(this.timer);
}
}


什么是
页面重定向。是否选中?您几乎肯定需要
document.getElementById(“pageRedirect”).checked
$(“#pageRedirect”).prop(“checked”)
。您可以声明
var pageRedirect,然后将其设置为DOMContentLoaded处理程序中的元素,以继续在其余部分中使用它code@Plato-许多人使用带有连字符的ID和名称来防止它们成为全局变量。什么是
pageRedirect.checked
?您几乎肯定需要
document.getElementById(“pageRedirect”).checked
$(“#pageRedirect”).prop(“checked”)
。您可以声明
var pageRedirect,然后将其设置为DOMContentLoaded处理程序中的元素,以继续在其余部分中使用它code@Plato-很多人使用带有连字符的ID和名称来防止它们成为全局变量,这是因为当处理程序运行第二次单击时,您希望在第一次单击时清除计时器噢,我明白了,这是因为当处理程序运行第二次单击时,您希望在第一次单击时清除计时器