“脚本错误”。仅在Safari的window.onerror中出现的错误。

8

当我在window.onerror中捕获错误时,我遇到了“Script Error。”的问题,即使我已经在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中也能正常工作?


顺便提一下,你的<script>元素不能自闭合 - 我想这可能是错误的原因? - Dai
2个回答

10
无法在Safari中实现。当前版本的Safari不支持在跨域情况下向onerror回调提供错误消息 - 即使在script元素上指定了crossorigin属性也不行。Safari以前确实支持它,但随后某些地方出现了退化。这个问题在https://bugs.webkit.org/show_bug.cgi?id=132945上有一个未解决的bug。

0

看起来CORS不是问题。似乎并非每个浏览器都支持全局onerror处理程序。

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

实际上,这可能与CORS有关。

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


1
不,即使我用addEventListener(“error”替换onerror,它仍然以相同的方式运行。此外,在Safari中,对于来自同一域的异常,onerror对我来说运行得很好。 - Anton Astashov

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