我目前正在尝试使用jquery报告所有未捕获的JS错误:
window.onerror = function(msg, file, line) {
$.post("https://"+current_url+"/js_error", {
msg: msg
file: file
line: line
});
}
current_url
始终是我目前所在的域名。
当我在www.website.com
并且脚本从www.website.com/script.js
(同一个域)加载时,一切正常。我尝试使用未定义的变量,并将variable is undefined
后缀发送到https://www.website.com/js_error
。
现在,我有一些子域:a.website.com
,b.website.com
等等。所有这些子域都有不同的内容,但使用完全相同的javascript。
我的想法如下:始终包含来自www.website.com
的javascript,以便在切换子域时,脚本可以由浏览器缓存,而不必再次重新加载。
但不幸的是,这打破了上面的错误报告。当脚本包含在其他域中时,例如我在a.website.com
并包含来自www.website.com/script.js
的脚本,我只将这些错误发布到https://a.website.com/js_error
(对于Firefox浏览器):
"Script Error." on line 0
我意识到这是由于同源策略,请参阅this question。
我还尝试将current_url
硬编码到www.website.com
(从加载脚本的位置),因此无论我在哪个域,POST都会始终存在。但是这个POST在与www.website.com
不同的子域中根本不起作用(我认为因为跨域ajax POST是不可能的)。
我还尝试将错误发送为GET($.get
),但这总是在子域上提供"Script Error." on line 0
- 无论GET的目标是什么。
那么,如何为脚本报告错误?我想检测它们以便我可以修复它们,但不想放弃缓存。
BTW:我正在使用firebug来调试我的脚本,所以当我获取它们时我会检测到错误。但由于复杂性,并不总是能够发现每个操作系统/浏览器组合的每个错误,而且我希望确保在客户端发生它们时也能检测到它们。
编辑:jsfiddle已删除
答案 0 :(得分:2)
CORS正是您的问题,只需将CORS允许的标头添加到您的https://"+current_url+"/js_error
响应中。
Access-Control-Allow-Origin: *
或者更具限制性。
Access-Control-Allow-Origin: http://a.website.com http://b.website.com
http://enable-cors.org/是一个很好的资源。
至于window.onerror没有向你提供来自不同域的错误的所有数据; 我可以确认这不是你疯了,这就是firefox的运作方式。 http://jsbin.com/ojavoy/3/edit#javascript,html
我看到人们将脚本包裹在try {} catch {}块中。这将适用于跨浏览器,并将捕获一些但不是所有错误(在IE中哪个更好)。目前还没有“正确的方法”。