繁体   English   中英

如何在代码外部停止Javascript中的setInterval循环而不刷新浏览器?

[英]How to stop a setInterval Loop in Javascript outside of code without refreshing the browser?

这可能是一个非常幼稚的问题,但我确实需要一些帮助。

在写这篇文章之前,我是在JSBin上编程的。 原来,我没有意识到,我运行了一个setInterval循环,提示输入userInput,并且该循环一直在循环,这使我无法单击任何位置来更改代码来修复该循环。 它不断重复。 到了必须刷新并丢失所有手写代码的地步(我没有登录,所以我的代码没有保存)! 我想下次避免。

因此,我的问题是如何停止任何此类setInterval循环,以便能够访问我的代码并对其进行更改并重新运行它。 如果您尝试在JSBin.com上运行它,则下面的代码演示了我的问题 (显然,这不是我之前编写的代码)。 如您所见,我无法单击我的代码以任何方式对其进行更改(或保存),这意味着我丢失了所有代码!

这似乎是一个无用的问题,但是我真的很想知道修复它的方法,也许从开发人员工具中修复它可以使我熟悉它拥有的绝大多数工具:P。 因此,如果您知道解决方案,请帮助我。

感谢您抽出宝贵的时间来帮助我! 我很感激。

setInterval(demo,1);
function demo()
{
     var name = prompt("Enter your name: ");
}

这是一种hack ,仅应在OP中公开的情况下使用,但是,
几乎所有实现都使用整数作为timerid ,在每次调用时都会增加整数。

因此,您可以做的是清除页面上创建的所有超时。
为此,您需要先到达我们所在的时区,然后循环调用cleatTimeout或clearInterval(它们执行相同的操作),直到到达最后一个调用:

 function stopAllTimers() { const timerid = setTimeout(_=>{}); // first grab the current id let i=0; while(i < timerid) { clearTimeout(i); // clear all i++; } }; btn.onclick = stopAllTimers; // some stoopid orphan intervals setInterval(()=>console.log('5000'), 5000); setInterval(()=>console.log('1000'), 1000); setInterval(()=>console.log('3000'), 3000); const recursive = () => { console.log('recursive timeout'); setTimeout(recursive, 5000); }; recursive(); 
 <button id="btn">stop all timeouts</button> 

假设开发工具已关闭,则几乎同时按下escf12 这应该打开开发工具。 如果它一直尝试直到它继续尝试。

打开它们后,按escf8 再一次,重试直到它在代码中的任意点处停止javascript执行。

在“源”选项卡中,找到您编写的脚本(从JSBin中不知道它的外观),然后从字面上删除var name = prompt("Enter your name: "); 线。 再次点击f8将继续执行,就像“新”代码正在运行一样。 在刷新页面之前,这应该使您腾出时间从网站本身复制/粘贴代码。

另一种选择是在开发人员工具的“元素”面板中搜索iframe(即使由于prompt的阻塞而导致主文档无响应,此操作也应可行)-然后,只需右键单击iframe元素并将其删除,无需键入任何Javascript。 (或者,如果您愿意,可以使用querySelector选择iframe并将其删除,例如document.querySelector('iframe').remove()

暂无
暂无

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

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