繁体   English   中英

如何将 setInterval 设置为全局变量?

[英]how can I set a setInterval as a global variable?

我只想制作一个按钮来开始在我的正文中添加一些文本,以及一个停止添加此文本的按钮。

我发现我可以在函数或 setInterval 中使用 setTimeout ......但由于局部范围我无法清除它们......我不能将它们都声明为全局范围,我想要我的 button.onclick 不是默认激活它们。

 /* global document*/ var myStart = document.querySelector('#start'), myEnd = document.querySelector('#end'), myRepeat; function start() { "use strict"; document.body.innerHTML += '<br>Welcome StackOverFlowMembers!'; myRepeat = setTimeout(start, 1000) } function stop() { "use strict"; clearTimeout(myRepeat); } myStart.onclick = start; myEnd.onclick = stop;
 <body> <button id="start">Start!</button> <button id="end">End!</button> <script src="script.js"></script> </body>

这里的问题不在于变量的范围。 你的代码实际上一切都很好。

问题在这里:

document.body.innerHTML += '<br>Welcome StackOverFlowMembers!';

如果您将其替换为:

console.log('Hello!');

两个按钮都会正常工作。 检查这个小提琴

基本上,当您使用innerHTML您会破坏事件侦听器。 您可以在此答案中找到更多相关信息

正如@anpel 的回答所解释的那样,您的innerHTML调用正在破坏您的事件侦听器。 在下面的代码中,我通过将onclick属性直接放入 HTML 按钮元素来解决这个问题。 布尔doRepeat变量控制是否启动后续超时。

 /* global document*/ var myStart = document.querySelector('#start'), myEnd = document.querySelector('#end'), doRepeat; function start() { "use strict"; document.body.innerHTML += '<br>Welcome StackOverFlowMembers!'; if (doRepeat) { setTimeout(start, 1000); } }
 <body> <button id="start" onclick="doRepeat=true;start();">Start!</button> <button id="end" onclick="doRepeat=false;">End!</button> <script src="script.js"></script> </body>

或者,您可以制作一个单独的<div> ,您的函数将其文本写入其中 - 而不是您如何对整个 HTML body执行innerHTML ,这会破坏所有子侦听器 - 您不必担心您的事件侦听器被销毁,因为这些侦听器不在目标 div 的子级上。

这是一个 JS Fiddle 来证明这一点: https : //jsfiddle.net/j9voxg7s/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM