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

Posted

技术标签:

【中文标题】“脚本错误。” window.onerror 中的错误仅在 Safari 中【英文标题】:"Script Error." errors in window.onerror in Safari only 【发布时间】: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; 元素不能自动关闭 - 我想知道这是否是导致错误的原因? 【参考方案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 有一个未解决的错误

【讨论】:

以上是关于“脚本错误。” window.onerror 中的错误仅在 Safari 中的主要内容,如果未能解决你的问题,请参考以下文章

使用 window.onerror 报告客户端错误的最佳实践?

window.onerror用法

window.onerror用法

window.onerror事件用来自定义错误处理

前端异常日志记录

对前端异常window error捕获的全面总结