【问题标题】:"Script Error." errors in window.onerror in Safari only“脚本错误。” window.onerror 中的错误仅在 Safari 中
【发布时间】:2018-02-01 07:54:49
【问题描述】:

我收到“脚本错误”。在 window.onerror 中捕获错误时,即使在 S3 上正确(我认为)配置了 CORS 标头。

CORS 配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

HTML:

<script crossorigin src="https://s3.amazonaws.com/safari-script-error/foo.js" />

其中包含:

window.addEventListener("keydown", function(event) {
  if (event.keyCode === 69) { // "e" button
    throw new Error("Oh shoot");
  }
});

JS:

window.onerror = function(event) {
  console.log(event);
}

Codepen:https://codepen.io/astashov/pen/yoEvRB

它在 Chrome、Firefox 和 IE11 中运行良好,并且只显示“脚本错误”。在 Safari 中(我有版本 10.0.3 (12602.4.8))。

如何让它在 Safari 中也能正常工作?

【问题讨论】:

  • 顺便说一句,您的 &lt;script&gt; 元素不能自动关闭 - 我想知道这是否是导致错误的原因?

标签: javascript html safari cors onerror


【解决方案1】:

CORS 似乎不是问题所在。似乎并非所有浏览器都支持全局 onerror 处理程序。

见: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror

其实可能和CORS有关。

当从不同来源加载的脚本中出现语法(?) 错误时,不会报告语法错误的详细信息以防止信息泄露(请参阅错误 363897)。相反,报告的错误只是“脚本错误”。在某些浏览器中,可以使用 crossorigin 属性覆盖此行为,并让服务器发送适当的 CORS HTTP 响应标头。一种解决方法是隔离“脚本错误”。并在知道错误详细信息只能在浏览器控制台中查看且无法通过 JavaScript 访问的情况下处理它。

【讨论】:

  • 不,即使我将onerror 替换为addEventListener("error,它的行为仍然相同。此外,onerror 对我来说很好,因为异常来自 Safari 中的同一域。
【解决方案2】:

如何让它在 Safari 中也能正常工作?

你不能。当前的 Safari 版本不支持在跨域情况下向 onerror 回调提供错误消息——即使在 script 元素上指定了 crossorigin 属性。

Safari 之前确实支持它,但后来在某个时候退步了。

https://bugs.webkit.org/show_bug.cgi?id=132945 有一个未解决的错误

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多