14

我试图理解为什么 Firefox(我使用的是 15,但即使在夜间也一样)在尝试访问错误事件信息时的行为不像 WebKit。

这个在任何地方都有效:

window.onerror = function(message, lineno, filename) { }

但我当然不想用这个。

正确的做法是:

window.addEventListener('error', function(e) { 
  console.log(e.message);
}, false);

不幸的是,这仅适用于 WebKit。在 Firefox 中,处理程序被调用,但e事件几乎是空的:没有消息,没有行号,没有文件名属性。

最小的测试在这里:http: //jsbin.com/efexiw/1/edit

不过,我不认为这是一个错误……所以问题是:如何在最近的 Firefox 中获取错误详细信息?

4

1 回答 1

24

HTML5 规范要求解析失败会导致浏览器:

...报告脚本错误,使用全局对象...作为目标,使用有问题的位置(行号和列号)。

其中“报错”包括步骤

  1. message是一个用户代理定义的字符串,以一种有用的方式描述错误。

...

  1. event是一个新的可信ErrorEvent对象,它不会冒泡但可以取消,并且具有事件名称error

  2. 将eventmessage属性初始化为message

...

  1. 目标调度事件

因此,任何兼容 HTML5 的浏览器都会报告解析时错误事件window,其中包括message设置为“用户代理定义的字符串以有用的方式描述错误”的属性。任何未能做到这一点的浏览器版本还没有在这方面符合 HTML5。


以前(在编写此问题时),window.onerror提供了window.addEventListener("error"). 如果您必须使用旧版本的 Firefox,您可以安全地使用window.onerror

// Example 1:

// Prevent error dialogs from displaying -which is the window's normal
// behavior- by overriding the default event handler for error events that
// go to the window.
window.onerror = null;

// Example 2:

var gOldOnError = window.onerror;
// Override previous handler.
window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
  if (gOldOnError)
    // Call previous handler.
    return gOldOnError(errorMsg, url, lineNumber);

  // Just let default handler run.
  return false;
}
于 2012-10-05T13:31:37.143 回答