0

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

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

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

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

感谢您花时间帮助我!我很感激。

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

3 回答 3

1

这是一种 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();
<button id="btn">stop all timeouts</button>

于 2019-01-16T04:08:24.427 回答
1

假设开发工具是关闭的、命中的esc并且f12几乎是同时的。这应该会打开开发工具。如果它不继续尝试,直到它这样做。

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

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

于 2019-01-16T04:08:32.443 回答
1

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

于 2019-01-16T04:16:44.190 回答