打印

SD2020: 仅 IE 和 Firefox 支持 window 对象的 onerror 事件

作者:陆远

标准参考

无。

问题描述

IE 和 Firefox 提供了对 window.onerror 事件的支持,当页面内的 JavaScript 脚本出现错误时,window.onerror 被触发。

造成的影响

若希望通过 window.onerror 事件屏蔽页面中的脚本错误,或者获取页面脚本错误的信息,则在不同浏览器中会产生差异。

受影响的浏览器

IE6 IE7 IE8 Firefox  

问题分析

W3C HTML4.01 规范第 18.2.3 节介绍了 HTML 中的固有事件(Intrinsic events),其中并没有 onerror 事件。

在 HTML5 规范草案中描述了 window 对象的事件处理程序,其中有 onerror 事件存在,详细情况请参照草案说明:6.1.6.2 Event handlers on elements

根据 MSDNMozilla Developer Center 中的描述,当页面中的脚本出错的时候就会触发 window.onerror 事件,这个事件的监听器(event handler)拥有三个参数:msg(错误消息内容)、url(发生错误的页面的 URL)、line(发生错误的代码所在行行号)。

而浏览器是否按照其默认方式显示错误消息,取决于 onerror 事件的返回值。若返回 false,则在浏览器控制台(若有)中显示错误消息。反之则不再显示错误消息。

分析以下代码:

<script>
  window.onerror = function (msg, url, line) {
    alert(url + ":\nline:" + line + "\n" + msg);
    return true;
  }
  asd
</script>

上面代码为 window.onerror 事件绑定了一个监听器,并试图在脚本出错的时候显示出脚本出错时显示出错页面 URL、行号及错误信息。

在各浏览器中运行结果为:

IE6 IE7 IE8 Firefox Chrome Safari Opera
window.onerror.html:
line:6
'asd' 未定义
window.onerror.html:
line:6
asd is not defined
控制台提示:
Uncaught ReferenceError: asd is not defined ReferenceError: Can't find variable: asd Uncaught exception: ReferenceError: Undefined variable: asd

可见,window.onerror 事件仅 IE、Firefox 可以被触发,返回了需要的信息,并屏蔽了控制台的错误提示。

解决方案

放弃使用 window.onerror,通过合理使用 try-catch 来达到近似的效果。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6.7
Chrome 4.0.472.0 dev
Safari 5.0
Opera 10.60
测试页面: window.onerror.html
本文更新时间: 2010-07-22

关键字

window onerror 错误 event