“脚本错误。” 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 中也能正常工作?
【问题讨论】:
顺便说一句,您的<script>
元素不能自动关闭 - 我想知道这是否是导致错误的原因?
【参考方案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 中的主要内容,如果未能解决你的问题,请参考以下文章