【问题标题】:How to stop a setInterval Loop in Javascript outside of code without refreshing the browser?如何在不刷新浏览器的情况下在代码之外的 Javascript 中停止 setInterval 循环?
【发布时间】:2019-01-16 03:56:52
【问题描述】:

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

在写这篇文章之前,我在 JSBin 上编程。结果在我没有意识到的情况下,我运行了一个 setInterval 循环提示 userInput 并且它继续循环,使我无法单击任何地方来更改代码以修复循环。它不断地重复和重复。它到了我不得不刷新并丢失所有硬写代码的地步(我没有登录,所以我的代码没有保存)!下次我想避免这种情况。

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

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

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

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

【问题讨论】:

  • 你的预期输出是什么?
  • 我不需要这个特定代码的输出。相反,我正在寻找停止无限 setInterval 循环的方法,从而能够访问 JSBin 中的代码。

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


【解决方案1】:

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

【讨论】:

  • @CertainPerformace 哇!这创造了奇迹。谢谢!有趣的是,当我尝试扩展所有选项并寻找 iframe 标签时,我找不到它。猜它没有显示完整的文件?
  • 尝试使用 control-F 并输入iframe,在点击一些提示后,它最终应该会扩展到 iframe(很遗憾,在提交提示之前可能不会响应)。或者,在单独的选项卡中打开页面并检查 iframe 在 HTML 中的位置,然后导航到被阻止页面上的该位置。
【解决方案2】:

这是一种 hack 并且应该只在像 OP 中暴露的情况下使用但是,
几乎所有的实现都使用整数作为timerid,每次调用都会递增。

因此,您可以做的是清除页面上创建的所有超时。
为此,您需要首先获取我们所在的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();
&lt;button id="btn"&gt;stop all timeouts&lt;/button&gt;

【讨论】:

  • 即使他预先将这个添加到他创建的每个 bin 中,在无限模式的情况下他仍然无法单击按钮
  • 对于 OP 遇到的问题(例如使用 JSBin 或 JSFiddle 或堆栈 sn-ps),他们将不得不访问 沙盒 iframe.contentWindow.setTimeout(否则他们'将只是访问非沙盒页面窗口,该页面窗口由于 iframe 而没有响应,并且没有运行有问题的超时)
  • 是的,这是一个很好的观点@CertainPerformance 仍然非常可行。大多数开发工具控制台都有切换上下文选项。
  • @LeroyStav 你可以从控制台运行它;-)
  • @Kaiido 我今天学到了新东西!即使模态打开,f12 也可以在 chrome 中工作!谢谢 :-) 我的意思是,我永远不需要知道这个......我不记得我上次使用 alertprompt 是什么时候了
【解决方案3】:

假设开发工具已关闭,几乎同时点击escf12。这应该会打开开发工具。如果它不继续尝试,直到它尝试。

打开后,点击escf8。再次重试,直到它在代码中的某个任意点停止 javascript 执行。

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

【讨论】:

  • 当然,这专门用于当警报/提示阻止您访问页面本身时。否则,只需点击f12 打开开发工具,点击f8 停止执行
  • 我在 (runner)/ JS Bin Output / (no domain) / *(someweirdname).js 文件下找到了代码。是的,它非常有帮助,因为它可以让我复制我的代码。但是,它并没有像“新”一样运行。在我删除该行甚至 setInterval 行之后,它仍然运行相同的代码。不过感谢您的解决方案!
  • 谢谢你很好,但接受答案更好!
  • 真的吗,@HavocLee?体谅帮助您的人,如果他们提供帮助,请将答案标记为正确!我们会花时间帮助您,您至少可以点击一个按钮。
  • 我确实做到了。你的答案显然很有帮助,但我只能标记一个答案:( - 所以我选择了我认为最有帮助的一个。
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2015-03-21
  • 2015-05-11
  • 1970-01-01
  • 2013-11-20
  • 2012-03-01
相关资源
最近更新 更多