在IE9中使用Javascript clearTimeout()时,如何防止"Argument not optional"错误?

Vol*_*ike -2 javascript settimeout internet-explorer-9

以下Javascript代码适用于除IE9之外的所有浏览器.有什么问题?

setTimeout('doSomething();clearTimeout();',500);
Run Code Online (Sandbox Code Playgroud)

调试器说它希望我将ID号传递给clearTimeout(),当我所做的只是清除所有超时时.

Spu*_*ley 6

正如其他人所说,clearTimeout()没有任何论据也没有做任何事情.clearTimeout()要求您指定要清除的超时.这适用于所有浏览器.也许只有IE报告错误,但它导致了所有这些错误.

也许你打电话的原因clearTimeout()是你认为setTimeout()需要被清除以防它被不断调用?这是不正确的 - setTimeout()导致其代码在给定的时间之后被调用一次.

因此,既然您已经尝试在触发超时后清除超时,那么无论如何都无法清除.

有一个单独的命令setInterval(),它会触发重复超时.这需要被清除以阻止它一遍又一遍地调用,但setInterval()无论如何通常认为这是一个坏主意,所以我不会在这里过多地讨论它.

您应该做的另一件事是避免setInterval使用字符串参数调用.只需指定要直接调用的函数即可.

简而言之,您的代码应如下所示:

setTimeout(doSomething,500);
Run Code Online (Sandbox Code Playgroud)

这应该足以让您的示例在所有浏览器中正常工作.

正如我所说,你不需要在你的情况下清除超时,但是如果你确实需要在另一个实例中清除它,你需要setTimeout(或setInterval)返回一个值.此值是计时器的参考对象,此参考是您需要传递的内容clearTimeout.

即:

var timer;
....
timer = setTimeout(doSomething,500);
....
....
//something happened, I need to cancel the timeout:
clearTimeout(timer);
Run Code Online (Sandbox Code Playgroud)

希望有助于澄清事情.