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

时间:2019-01-16 03:56:53

标签: javascript setinterval developer-tools jsbin google-developer-tools

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

这是一种黑客行为,仅应在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>

答案 1 :(得分:1)

假设关闭开发工具,几乎同时命中escf12。这应该打开开发工具。如果它一直尝试下去,就一直尝试。

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

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

答案 2 :(得分:1)

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