【问题标题】:How do you interrupt JS in browser?如何在浏览器中中断 JS?
【发布时间】:2012-03-28 09:39:58
【问题描述】:

对于 Chrome 和 Firefox,在控制台中按 Ctrl+C 的作用是什么?在实现各种算法时,我经常在 Javascript 中编写一些错误的 (while) 循环,它不会退出,使浏览器冻结。重新加载不起作用,单击小 X 关闭选项卡没有任何作用,过一会儿(字面意思)我内存不足,系统正在交换,我要去喝咖啡休息了。

【问题讨论】:

  • 我不得不承认,这更多的是作为浏览器开发人员的“动力”,以解决这种情况。
  • 坦率地说,现有的 JS 执行器是愚蠢的,他们不能做这么简单的事情。

标签: javascript firefox google-chrome browser


【解决方案1】:

对于 JavaScript,没有 Ctrl + C 这样的东西。执行 JavaScript 的浏览器通常会保护自己。如果有任何 JavaScript 挂起,它们会抛出一个对话框,询问用户是否要停止 JavaScript。

超时时间通常可以在浏览器的设置中找到。您可以在此处找到如何为 FireFox 执行此操作:http://kb.mozillazine.org/Dom.max_script_run_time

【讨论】:

  • 当我的系统已经在交换时,他们确实抛出那个对话框有点太晚了。
【解决方案2】:

在 Chrome 中,您可以点击Shift+ESC(或右键单击标题栏并打开 Chrome 任务管理器)并终止与挂起的选项卡关联的进程。这适用于无法关闭选项卡的情况。

需要注意的是,有时 Chrome 会将多个选项卡简化为一个进程,这会杀死与该进程关联的所有选项卡。


另一种避免while循环挂起浏览器的方法是编写这样的代码(测试后可以取出):

var maxIterations = 100000; 
while (foo) {
    if (!maxIterations--) throw new Error('Max iterations hit, aborting.');
    // do stuff
}

在 Chrome 的任务管理器中单击鼠标右键并选择上下文菜单底部的项目以显示一个奇怪的复活节彩蛋。

【讨论】:

  • while (foo && --maxIterations) { ... }
  • @vol7ron 我将 maxIterations 的内容与其余代码放在不同的行中,以便以后可以在需要时轻松删除
  • 这无法扩展,我正在实现可能运行几秒钟的算法(有效地阻止 UI)。我真的在问 JS 引擎的 SIGINT 等价物。
  • @skrat chrome 的任务管理器不会被通常会阻止 UI 的东西阻止。或者您是说您想以编程方式执行此操作?
  • @GGG 不是以编程方式,但您实际上给了我扩展的想法:Ctrl+C = 结束任务(如果 API 提供)
【解决方案3】:

在浏览器中运行 Javascript 代码没有真正的“中断器”。 ECMAscript 在所谓的“UI 线程”中执行,这意味着所有渲染内容都发生在 ECMAscript 代码执行的同一个队列中。

这反过来意味着,ECMAscript 中的无限循环会自动挂起整个浏览器交互。

避免这种情况的唯一方法是编写清晰、干净的代码。如果发生这种情况,大多数浏览器会意识到 UI 线程太忙,并询问用户是否要取消正在运行的 javascript 进程。如果您不想等待,您唯一的选择就是杀死整个浏览器/选项卡进程。

但是,如果您知道脚本的某些部分可能会导致无限循环,您可以在某种developer tools 中手动设置breakpoints,或者您可以将debugger; 关键字直接插入到您的脚本中.这会导致 javascript 解释器在当前行停止,您有机会分析下一个代码(例如 while 条件)并在看起来不好时取消执行。

【讨论】:

  • 我什么都做不了,试试while (1) {}循环,然后尝试干净退出(关闭标签、关闭窗口等)
【解决方案4】:

根据我对您工作方式的一点了解,我将如何进行:

  • 仅在按钮单击等事件上执行脚本。这将阻止脚本运行onload
  • Chrome 允许您在开发者工具的脚本选项卡中的 js 代码中设置断点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2018-04-10
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多