【问题标题】:Cancel infinite loop execution in jsfiddle取消jsfiddle中的无限循环执行
【发布时间】:2011-11-28 18:58:57
【问题描述】:

当您在 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--

有什么想法吗??我的标签仍然打开,我希望在不关闭标签的情况下将其取回:-)

【问题讨论】:

  • 不能在调试器中修改c的值吗?
  • Firefox 检测到无限循环并停止它们
  • Chrome 最终应该会问你是否要杀死脚本,如果你放手的话。
  • @ryudice 很高兴知道,但这对他没有帮助。我刚刚复制了一个无限循环,但还没有找到介于两者之间的方法。还在尝试。
  • @methodin:它已经运行了大约 10 分钟(c = 9494127),它仍然没有问我是否要停止脚本。我必须先将注意力集中在那个窗口上吗?编辑:我得到了弹出窗口,但唯一的选择是Kill Pages,而不是停止脚本。这将丢失我的所有数据。

标签: javascript google-chrome infinite-loop jsfiddle


【解决方案1】:

如何在没有开发者模式的情况下做到这一点:

  • 打开一个新标签
  • 使用 Shift-Escape 打开任务管理器
  • 杀死任务
  • 为被杀死的标签使用返回按钮(JSFiddle 不会运行脚本)
  • 修复错误
  • 更新

或者在 MacOS 上,

  • 打开活动监视器
  • 杀死第一个“Google Chrome Helper (Renderer)”进程。应该是 JSFiddle
  • 修复问题
  • 运行代码

【讨论】:

  • 这是一个更好的答案
  • 为我工作,谢谢,但我确实丢失了我的最后一次编辑,所以也许这种方法并不适合所有人
  • @Adam Ritter:这对我有用。非常感谢您发布...这是救命稻草。
  • @Luke 你是什么意思?这个答案太棒了!
  • @ADAM 嘿伙计.. 真的谢谢。你的建议让我从一个简单的无限通话问题中节省了将近一天的工作时间。 :)
【解决方案2】:

我的文件卡在一个循环中,并且还会冻结 JSFiddle 上的仪表板。

  • 我可以清除的唯一方法是在首选项选项卡中禁用 JavaScript,同时我在另一个 Chrome 选项卡中打开了一个新的 Fiddle 页面。
  • 然后导航到 All Fiddles。
  • 删除 Fiddle 会出现 404 错误。
  • 打开 JavaScript 并重新加载仪表板。
  • 之后能够继续制作和编辑小提琴。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果他没有打开开发选项卡,他可能会被搞砸。当我尝试它时,该页面为我死了。
    • 他说他已经打开了
    • @Walkerneo:太棒了!呃,只需复制脚本并将其粘贴到其他地方...大声笑知道了,谢谢!如果适用,还需要复制 html/css 代码。如果您还没有打开开发人员控制台,如果有办法到达那里,也很高兴知道。如果发生这种情况,你可能会被搞砸。
    • 我打开了它,但它无法加载任何 html/javascript/css/anything。断点也不起作用:\
    • 是的,如果你不打开它,你就完蛋了。
    【解决方案4】:

    当循环选项卡处于活动状态时,我无法启动 Chrome 的任务管理器。我不得不选择另一个标签。然后我按下 Shift-Escape 启动任务管理器,终止 JSFiddle 进程,重新选择选项卡,然后点击返回按钮以显示页面而不运行脚本。

    JSFiddle 使用 iframe 加载“结果”面板。截至 2016 年 6 月,框架的 URL 是 Fiddle URL 加上“/show/”。我检查了 iframe 的源代码,发现它加载了另一个带有“/light/”的 URL。这些 URL 之一应包含您的源代码。

    如果您的浏览器支持view-source URI scheme,您可以通过以下方式访问您的小提琴源代码:

    • 查看源:jsfiddle.net/user_name/fiddle_hash/revision/light/
    • 查看源:jsfiddle.net/user_name/fiddle_hash/revision/show/

    【讨论】:

      【解决方案5】:

      如果其他人在阅读其他答案后遇到困难,这对我有用(Chrome、Mac)。对我来说,JSFiddle 选项卡“卡住”了,但 Chrome 的其余部分是响应式的。我在资源窗格中打开了 JavaScript 控制台,但它也没有响应。在这种状态下重新加载页面并没有帮助,因为 JSFiddle 会在我得到任何东西之前给我脚本。

      最后这对我有用;也许它也能帮助你......

      • 当页面无响应时,请转到 Chrome &gt; Preferences &gt; Privacy 并禁用 JavaScript。
      • 等待页面消失(对我来说大约需要 4 或 5 分钟);悲伤的脸图标出现在该标签中。
      • 点击返回按钮。它应该看起来像 JSFiddle 正在加载,但它不会,因为有趣的是,JSFiddle 需要 JavaScript 来呈现页面。
      • View &gt; Developer &gt; View source
      • 我的剧本,只是略有损坏,像在一个名为 'panel_js'div 中一样无辜地坐在那里。
      • 突出显示、复制、再次呼吸、吸取教训。

      【讨论】:

        【解决方案6】:

        打破无限循环的一种方法是抛出一个未处理的异常,这将停止当前调用堆栈的执行。 这样做:

        1. 暂停调试器
        2. 在循环中找到一个有希望的语句,例如函数调用:foo.bar(args)
        3. 在控制台中,覆盖要抛出的函数:foo.bar=function(){throw 42;}
        4. 取消暂停调试器

        为我工作。我没有尝试过,但我相信通过重载 getter 或 setter,您可以将上述技巧用于赋值和读取,而不仅仅是函数调用。此外,通过将变量设置为未定义,如果在循环中使用此变量的字段,则可能会导致致命错误(并因此中断循环)。例如delete foo.tab 将破坏foo.tab[42]foo.tab.bar。出于某种原因,简单地在控制台中写入foo=undefined 是行不通的(也许它定义了一个名为 foo 的控制台窗口本地变量)。

        【讨论】:

        • 在无限循环中间暂停时,我似乎无法更改任何变量值...
        【解决方案7】:

        运行进程资源管理器并终止使用大量 CPU 的 chrome 进程...它会“崩溃”页面并让您重新加载...

        【讨论】:

        • 终止进程不是问题。我不想丢失我当前的脚本。
        【解决方案8】:

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

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

        【讨论】:

        • 为了清楚起见,我忘记更改的while循环条件中使用的变量。我通过控制台更改了它,循环结束了。
        • 没错,你可以改变变量值来结束循环。这也是我最先想到的。但是,在我的特定情况下(使用 jsfiddle),执行脚本在主页面的子框架中的不同域中运行,因此您无法修改框架中的变量值,这会导致问题:)
        • @mellamokb 除了更改变量值不起作用!它似乎设置了它,但是当您读回它时,它又回到了旧值。啊!
        猜你喜欢
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        相关资源
        最近更新 更多