提到window.onerror,大家应该都不陌生吧。
为了屏蔽JS错误,为了应付所谓的领导的突击检查系统进度,可以暂时另令你的页面清净一下。
出现兼容性问题
看一个例子:
<script>
window.οnerrοr=function(){
document.write("encountered JS errors.");
}
as();
</script>
上面代码中执行了一个未定义的JS方法 as()。当执行时,找不到定义,会报JS错误。
这段代码,在IE和Firefox里都有效果,在页面上输出了: encountered JS errors.
在Chrome和Safati中,都在控制台报了JS错误。
Chrome:Uncaught ReferenceError: as is not defined
Safari:ReferenceError: Can't find variable: as
也就是说,在Chrome和Safari中,window.onerror未起作用。
可见,IE 和 Firefox 提供了对 window.onerror 事件的支持,当页面内的 JavaScript 脚本出现错误时,window.onerror 被触发。
标准中的说法
HTML4.01
W3C HTML4.01 规范第 18.2.3 节介绍了 HTML 中的固有事件(Intrinsic events),其中并没有 onerror 事件。
HTML5
在 HTML5 规范草案中描述了 window 对象的事件处理程序,其中有 onerror 事件存在,详细情况请参照草案说明:6.1.6.2 Event handlers on elements 。可见,各浏览器还没有统一此实现。
MSDN和MDC
根据 MSDN 及 Mozilla Developer Center 中 的描述,当页面中的脚本出错的时候就会触发 window.onerror 事件,这个事件的监听器(event handler)拥有三个参数:msg(错误消息内容)、url(发生错误的页面的 URL)、line(发生错误的代码所在行行号)。
而浏览器是否按照其默认方式显示错误消息,取决于 onerror 事件的返回值。若返回 false,则在浏览器控制台(若有)中显示错误消息。反之则不再显示错误消息。
可见,对window.error的支持差异来自标准自身的不一致性,啥时候HTML5正式发布了,啥时候这个问题也就解决了吧应该。
所以,还是放弃使用window.onerror吧,使用try-catch捕捉错误是比较标准的做法。
更多兼容性问题:
【分享】浏览器兼容性问题目录