在jsfiddle中取消无限循环执行

56

当你在Chrome的jsfiddle中遇到无限循环时,我所知道的唯一选择就是关闭选项卡。当然,这意味着你失去了当前窗口中所有的工作!有没有一种简单的方法可以停止一个无限执行的脚本?

  1. 我打开了开发者工具,因为我正在进行调试。
  2. 我能够暂停脚本并逐步执行循环。
  3. 我找不到任何地方停止脚本。
  4. 我不能修改脚本或变量以停止无限循环(因为脚本执行发生在一个不同域名的iframe中,因此使用JavaScript修改iframe中的数据是不被允许的,并会在控制台生成异常)。

这一切都始于我决定从循环中交换方向。

for (var c = 0; c <= 11; c++)

for (var c = 12; c > 0; c++)

但正如您在上面所看到的,我忘记将其从c++更改为c--

有什么想法吗?我仍然保留着这个选项卡,希望在不关闭选项卡的情况下将其恢复 :-)


1
你不能在调试器中更改c的值吗? - Joe
Firefox 检测到无限循环并停止它们。 - ryudice
如果你让脚本运行,Chrome 最终会询问你是否要终止它。 - methodin
1
@methodin:已经运行了约10分钟(c = 9494127),但它仍然没有问我是否要停止脚本。我需要先在那个窗口上保持焦点一段时间吗?编辑:我收到了弹出窗口,但唯一的选择是“终止页面”,而不是停止脚本。这将丢失所有我的数据。 - mellamokb
正如您在下面的答案中所评论的,我很高兴您能够打开开发工具并成功恢复代码。但是,如果情况不是这样,**"c"** 不会最终环绕到 **"0"**(或溢出),然后退出循环吗? - Kevin Fegan
显示剩余2条评论
8个回答

100

如何在没有开发者模式的情况下进行操作:

  • 打开一个新标签页
  • 使用Shift-Escape组合键打开任务管理器
  • 关闭任务
  • 在已关闭的标签页上使用返回按钮(JSFiddle将无法运行脚本)
  • 修复错误
  • 更新

或者在MacOS中:

  • 打开活动监视器
  • 关闭第一个“Google Chrome Helper (Renderer)”进程,它很可能是JSFiddle
  • 解决问题
  • 运行代码

8
这是一个更好的答案。 - SomeShinyObject
1
对我有用,谢谢。不过我失去了上次的编辑,所以也许这种方法并不适合每个人。 - dt192
1
@Adam Ritter:这对我很有用。非常感谢您的发布...这真是救命稻草。 - Eric Hepperle - CodeSlayer2010
1
@Luke 你是什么意思?这个答案很棒! - async
1
@ADAM 嘿,老兄。非常感谢你的建议。你的建议让我避免了一个简单的无限调用问题,节省了我将近一天的工作时间。 :) - Rajaprabhu Aravindasamy
显示剩余5条评论

6

使用开发者模式,进入资源管理器,找到您的脚本并将其复制粘贴到文本文档或新窗口中。如果在资源管理器中找不到它,请搜索您使用的变量或代码行。


1
如果他没有打开开发选项卡,他可能会遇到麻烦。当我尝试时,页面对我来说已经崩溃了。 - methodin
1
他说他已经打开了它。 - mowwwalker
@Walkerneo:太棒了!傻瓜式操作,只需将脚本复制并粘贴到其他地方即可...哈哈,我懂了,谢谢!如果适用的话,还需要复制HTML/CSS代码。如果你没有打开开发者控制台,是否有其他方法进入呢?如果没有,那你可能就完了。 - mellamokb
1
我成功打开了它,但是无法加载任何HTML / JavaScript / CSS / 任何内容。断点也不起作用:\ - Joseph Marikle
1
是的,如果你没有打开它,你就彻底完蛋了。 - mowwwalker
你可以尝试选择整个页面(Ctrl+A)并复制,然后关闭标签页。这不是很实用,但可以保存你的工作。 - bfontaine

3
打破无限循环的一种方法是抛出一个未处理的异常,这将停止当前调用栈的执行。 操作步骤如下:
  1. 暂停调试器
  2. 在循环中找到一个有希望的语句,例如一个函数调用:foo.bar(args)
  3. 在控制台中,重写该函数以抛出异常:foo.bar=function(){throw 42;}
  4. 恢复调试器
对我来说有效。虽然我没试过,但我相信通过重载getter或setter,你也可以使用上述技巧进行赋值和读取操作,而不仅仅是对函数调用进行操作。同样地,如果你将一个变量设置为undefined,则如果在循环中使用该变量的字段,则可能会导致致命错误(从而打破循环)。例如: delete foo.tab 将打破 foo.tab[42]foo.tab.bar。由于某种原因,仅仅在控制台中写入 foo=undefined 并不能实现此目的(也许它定义了一个名为“foo”的控制台窗口局部变量)。

我似乎无法在无限循环的中途暂停时更改任何变量值... - Michael

1
我无法在循环选项卡处启动Chrome的任务管理器。我必须选择另一个选项卡。然后,我按Shift-Escape启动任务管理器,终止JSFiddle进程,重新选择选项卡,并点击返回按钮以显示不运行脚本的页面。
JSFiddle使用iframe加载“result”面板。截至2016年6月,该框架的URL是Fiddle URL加上“/show/”。我检查了iframe的源代码,并发现它加载了另一个带有“/light/”的URL。其中一个URL应包含您的源代码。
如果您的浏览器支持view-source URI scheme,则可以按以下方式访问fiddle的源代码:
  • view-source:jsfiddle.net/user_name/fiddle_hash/revision/light/
  • view-source:jsfiddle.net/user_name/fiddle_hash/revision/show/

1
运行进程管理器,结束使用大量CPU的Chrome进程...这将"崩溃"页面并让您重新加载...

终止进程并不是问题,我不想丢失当前的脚本。 - mellamokb

0

我的文件陷入了循环,JSFiddle 的仪表板也会冻结。

  • 唯一的解决方法是在偏好设置选项卡中禁用 JavaScript,同时在不同的 Chrome 选项卡中打开一个新的 Fiddle 页面。
  • 然后导航到所有 Fiddles。
  • 删除 Fiddle,然后它会显示 404 错误。
  • 打开 JavaScript 并重新加载仪表板。
  • 之后就可以继续制作和编辑 Fiddles 了。

0

如果其他人在阅读其他答案后陷入困境,这是对我有用的方法(Chrome,Mac)。 对我来说,JSFiddle选项卡“卡住了”,但Chrome的其余部分响应灵敏。 我在资源窗格上打开了JavaScript控制台,但它也没有响应。 在此状态下重新加载页面没有帮助,因为在我什么都没有得到之前,JSFiddle会给我脚本。

最终,这对我有用; 也许它也会帮助您...

  • 在页面无响应时,转到 Chrome&gt;首选项&gt;隐私并禁用JavaScript。
  • 等待页面死亡(对我来说大约需要4或5分钟); 悲伤的表情符号出现在该选项卡中。
  • 点击返回按钮。 它应该看起来像JSFiddle正在加载,但它不会,因为有趣的是,JSFiddle需要JavaScript才能呈现页面。
  • 查看&gt;开发人员&gt;查看源代码
  • 我的脚本,只是稍微混乱了一点,坐在一个名为'panel_js'
    中,就像无辜的人一样。
  • 突出显示,复制,再次呼吸,学习教训。

0

这里出现了同样的问题,我在脚本暂停状态下打开了JavaScript控制台。(使用开发者工具暂停)

然后我改变了变量的值,以便while循环结束。


为了明确起见,我忘记更改while循环条件中使用的变量。我通过控制台进行了更改,循环结束了。 - Rajavanya Subramaniyan
1
没错,你可以改变变量的值来结束循环。那也是我最先想到的事情。然而,在我的特定情况下(使用jsfiddle),执行脚本在子框架中的不同域中运行,因此无法修改帧中的变量值,这就导致了问题 :) - mellamokb
@mellamokb 除了更改变量值不起作用之外!它似乎设置了,但当您再次读取时,它又回到了旧值。 哎呀! - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接