如何在不同的域中报告脚本中的JS错误?

时间:2011-12-08 13:20:10

标签: javascript jquery caching error-handling cross-domain

我目前正在尝试使用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.comb.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已删除

1 个答案:

答案 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

  • Firefox省略了行号
  • Chrome未提供脚本名称或行号
  • IE< 8不支持window.onerror(不知道9)

我看到人们将脚本包裹在try {} catch {}块中。这将适用于跨浏览器,并将捕获一些但不是所有错误(在IE中哪个更好)。目前还没有“正确的方法”。