window属性:onerror
onerror属性
onerror属性表示error事件的事件处理程序的。针对不同类型的错误,在不同的目标上激发error事件:
- 当发生JavaScript运行时错误(包括处理程序中引发的语法错误和异常)时,使用接口ErrorEvent的error事件将在window被触发并被window.onerror()调用(以及由window.addEventListener连接的处理程序)。
- 当一个资源(如<img>or <script>)加载失败时,使用接口Event的error事件触发启动加载的元素,并调用元素上的onerror()处理程序。这些错误事件不会冒泡到window,但是(至少在Firefox中)可以通过单个捕获window.addEventListener来处理。
安装全局error事件处理程序对于自动收集错误报告非常有用。
onerror属性语法
由于历史的原因,不同的参数被传递给window.onerror和element.onerror处理程序(以及关于错误类型window.addEventListener的处理程序)。
window.onerror
window.onerror = function(message, source, lineno, colno, error) { ... }
参数:
- message:错误消息(字符串)。在HTML onerror=""处理程序event(sic!)中可用。
- source:引发错误的脚本的URL(字符串)
- lineno:发生错误的行号(数值)
- colno:发生错误的行的列号(数值)
- error:错误对象(对象)
当函数返回true时,这可以防止触发默认事件处理程序。
window.addEventListener( 'error')
window.addEventListener('error', function(event) { ... })
ErrorEvent类型的事件包含有关事件和错误的所有信息。
element.onerror
element.onerror = function(event) { ... }
element.onerror接受一个Event类型的单个参数的函数。
一个很好的例子就是当你使用一个图像标签时,并且需要指定一个备份映像,以防您需要的服务器因任何原因而无法使用。
<img src="imagenotfound.gif" onerror="this.onerror=null;this.src='imagefound.gif';" />
我们在函数中使用this.onerror=null的原因 是,如果onerror图像本身产生错误,浏览器将陷入无限循环。
笔记
当从不同来源加载的脚本中发生语法错误时,不会报告语法错误的详细信息,这样可以防止泄漏信息。相反,报告的错误只是"Script error"。这种行为可以在某些浏览器中使用<script>中的crossorigin属性来重写,并让服务器发送相应的CORS HTTP响应标头。解决方法是隔离“Script error”,并处理它,并且知道错误细节仅在浏览器控制台中可见而不能通过JavaScript访问。
window.onerror = function (msg, url, lineNo, columnNo, error) {
var string = msg.toLowerCase();
var substring = "script error";
if (string.indexOf(substring) > -1){
alert('Script Error: See Browser Console for Detail');
} else {
var message = [
'Message: ' + msg,
'URL: ' + url,
'Line: ' + lineNo,
'Column: ' + columnNo,
'Error object: ' + JSON.stringify(error)
].join(' - ');
alert(message);
}
return false;
};
当使用内嵌HTML标记时(<body onerror="alert('an error occurred')">),HTML规范要求传递给onerror的参数被命名为event,source,lineno,colno,error。在还没有实现这一要求的浏览器,他们仍然可以通过arguments[2]获得arguments[0]。
规范
规范 | 状态 | 注释 |
---|---|---|
HTML Living Standard 在这个规范中定义了'onerror'。 |
Living Standard
|
浏览器兼容性
在Firefox 14中,<script>加载失败之前, window.onerror调用了消息“Error loading script”。这在bug 737087中得到修复,现在 scriptElement.onerror在这种情况下被调用。
自Firefox 31以来,最后2个参数(colno和error)被添加,这意味着您可以通过提供的Error对象从window.onerror访问脚本错误的堆栈跟踪。