我该如何预防;参数非可选“;在IE9中使用Javascript clearTimeout()时出错?
以下Javascript代码适用于除IE9之外的所有浏览器。有什么办法我该如何预防;参数非可选“;在IE9中使用Javascript clearTimeout()时出错?,javascript,internet-explorer-9,settimeout,Javascript,Internet Explorer 9,Settimeout,以下Javascript代码适用于除IE9之外的所有浏览器。有什么办法 setTimeout('doSomething();clearTimeout();',500); 调试器说它希望我向clearTimeout()传递一个ID号,而我所做的只是清除所有超时。正如其他人所说,clearTimeout()没有任何参数是没有任何作用的清除超时()要求您指定要清除的超时。这适用于所有浏览器。也许只有IE在报告错误,但这在所有的IE中都造成了问题 您调用clearTimeout()的原因可能是您认为需
setTimeout('doSomething();clearTimeout();',500);
调试器说它希望我向clearTimeout()传递一个ID号,而我所做的只是清除所有超时。正如其他人所说,
clearTimeout()
没有任何参数是没有任何作用的<代码>清除超时()要求您指定要清除的超时。这适用于所有浏览器。也许只有IE在报告错误,但这在所有的IE中都造成了问题
您调用clearTimeout()
的原因可能是您认为需要清除setTimeout()
,以防不断调用它?这是不正确的--setTimeout()
导致在给定的时间量之后只调用其代码一次
因此,由于您试图在超时被触发后清除超时,因此没有什么可清除的
有一个单独的命令名为setInterval()
,它会触发重复超时。这需要清除,以阻止它一次又一次地调用,但通常认为使用setInterval()
是一个坏主意,所以我在这里不太详细地讨论它
您应该做的另一件事是避免使用字符串参数调用setInterval
。只需指定要直接调用的函数即可
简而言之,您的代码应该如下所示:
setTimeout(doSomething,500);
这应该足以让您的示例在所有浏览器中正常工作
正如我所说,您不需要在本例中清除超时,但如果您在另一个实例中确实需要清除超时,则需要让setTimeout
(或setInterval
)返回一个值。此值是计时器的引用对象,此引用是您需要传递到clearTimeout
中的内容
即:
希望这有助于澄清问题。将字符串传递给setTimeout是一种不好的做法。而是传递一个函数。好吧,尝试清除已经超时的超时确实没有多大意义。为什么需要清除超时呢?一旦它已经运行,clearTimeout就没有意义了。在这种情况下,我会将所有超时推送到一个数组,然后在
for
循环中清除它们。clearTimeout()
没有参数不会清除所有超时。它在所有浏览器中都不起任何作用;MDN将其记录为,不带参数运行与带未定义的参数运行相同,这是一个无效的超时ID。测试用例:setTimeout(function(){console.log('timeout')},1000);clearTimeout()代码>Chrome仍然会记录“超时”消息。它会清除此消息。我已经习惯了使用它,从以前的一个程序员那里借来的,他一定把这件事搞砸了。我不会再这样做了。
var timer;
....
timer = setTimeout(doSomething,500);
....
....
//something happened, I need to cancel the timeout:
clearTimeout(timer);