【问题标题】:Are separate Javascript Script tags isolated from each others errors?单独的 Javascript 脚本标签是否与其他错误隔离?
【发布时间】:2015-10-20 18:05:30
【问题描述】:

首先我将说明我想要实现的目标:我想要一些通过 websockets 连接到我的服务器的代码。我向浏览器发送消息,告诉它远程重新加载。我希望这段代码(除非它本身没有错误)不受其他页面错误的影响,这样我仍然可以远程硬刷新页面以修复所述错误。

在我对最新的 Chrome 和 iPad safari 的测试中,如果一个脚本标签中出现运行时异常,则该 js 执行会停止。但是,其他脚本标签中的任何其他 javascript 仍然运行没有问题。这是预期的行为,还是我只是走运?我抛出了 TypeError、throw new Error('something') 和未定义的错误,而我的其他脚本仍然运行良好。我这样做:

<script type='text/javascript' src='reloadCode.js'/>
<script type='text/javascript' src='mainApp.js'/>

如果我在 mainApp.js 中抛出一个 bajillion 错误,我的 websocket 代码仍然会运行并刷新 reloadCode.js 中的页面,即使首先评估了 mainApp.js

【问题讨论】:

标签: javascript html runtime-error


【解决方案1】:

好的,我自己做了一个测试以确保,(我不认为单独的 JS 文件应该在编译时相互混淆)

我首先创建了一个简单的 HTML 页面,其中包含 3 个 JS 文件。 这是JS文件

myscript1.js

alert("1");

myscript2.js

alert("2")a;

myscript3.js

alert("3");

HTML

<html>
<body>
<script src="myscript1.js"></script>
<script src="myscript2.js"></script>
<script src="myscript3.js"></script>
</body>
</html>

myscript1 和 myscript3 已运行,但由于错误未运行 myscript2,所以只要您的 reloadCode.js 工作正常,那么您将一切顺利

需要说明的是,我只收到了 2 个警报,而不是 3 个,这是因为 myscript2.js 没有编译。

【讨论】:

  • 太棒了。感谢 Canvas 和 Onilol 的保证。正如 Qix 所提到的,如果有人知道这方面的规范,那将更加令人放心。
  • 我只收到2个警报,基本上浏览器会编译每个JS文件,所以它编译第一个然后运行代码,然后编译第二个它会中断,所以它只是跳过那个然后转到第三个,然后编译并运行,这根本不是问题 :)
【解决方案2】:

除非它们在它们之间进行交互...然后是的,它们是相互分离的。

【讨论】:

  • 来源?规格参考?
【解决方案3】:

在第一个示例中,我分别在三个脚本标签中编写了三个 alert() (example)。触发警报('FIRST')和警报('THIRD')。

<script>alert('FIRST');</script>
<script>errorAlert('SECOND');</script>
<script>alert('THIRD');</script>

在第二个示例中,我在一个脚本标签 (example) 中编写了三个 alert()。仅触发警报('FIRST')。

<script>
alert('FIRST');
errorAlert('SECOND');
alert('THIRD');
</script>

【讨论】:

    【解决方案4】:

    解析错误

    添加到先前答案中的测试,似乎文档提到脚本标记中的所有错误都局限于该 scriptElement 并且不会影响页面上的其他人。对于解析阶段,对此的处理如下:

    如果 scriptElement 的脚本脚本为 null,则在 scriptElement 处触发一个名为 error 的事件,然后返回。

    如果上一步失败,则排队一个任务以在元素上触发一个名为 error 的事件,然后返回。否则,设 url 为结果 URL 记录。

    如果 scriptElement 的脚本脚本为 null,则在 scriptElement 处触发一个名为 error 的事件,然后返回。

    处理运行时错误

    一旦在脚本中检测到运行时错误,浏览器应该在目标scriptElement 上发出error 事件。如果未处理此事件,则浏览器会将错误转发到开发者控制台。

    error事件有如下接口:

    interface ErrorEvent : Event {
      constructor(DOMString type, optional ErrorEventInit eventInitDict = {});
    
      readonly attribute DOMString message;
      readonly attribute USVString filename;
      readonly attribute unsigned long lineno;
      readonly attribute unsigned long colno;
      readonly attribute any error;
    };
    

    处理运行时脚本错误的行为是:

    当用户代理要报告异常E时,用户代理必须报告相关脚本的错误,在包含脚本的资源中出现问题的位置(行号和列号),使用由脚本的设置对象作为目标。如果在此之后仍然没有处理错误,则可能会将错误报告给开发者控制台。

    来源: https://html.spec.whatwg.org/multipage/webappapis.html#runtime-script-errors

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2016-08-24
      相关资源
      最近更新 更多