onerror语法使⽤
onerror 默认有三个⼊参:
•msg: 错误信息
•url:错误所在⽂件
•line:错误所在代码⾏,整型
对于 <body onerror=”some code”>形式的,可以通过arguments[0]、arguments[1]、arguments[2]依次获取参数
js中我们最常⽤的就是js容错
基本特性
可以通过设置returnValue=true,或直接return true来阻⽌浏览器显⽰错误信息。但不会阻⽌script debuggers弹出的调试框。只有运⾏错误才会触发onerror,语法错误不会触发。
以下三种⽅式可以引发onerror:
•运⾏时错误,例如⽆效的对象引⽤或安全限制
•下载错误,如图⽚
•在IE9中,获取多媒体数据失败也会引发
<script> 标签不⽀持onerror。
定义在 <body> 标签上的onerror属性相当于r (经测试,Firefox、Opera⽀持,IE9、chrome⽆反应)。
浏览器兼容性
•Chrome 13+
•Firefox 6.1+
•Internet Explorer 5.5+
•Safari 5.1+
•Opera 11.61+ (QuirksMode 测试到11.51尚不⽀持,我⼿头上的11.61已⽀持)
除window对象外,⽀持 onerror 的元素:
•<img> 全⽀持
•<script> IE9/IE10/safari 5.1+/chrome 13+ ⽀持
<css> 和 <iframe> 不⽀持onerror。
问题与解决⽅案
复制代码代码如下:
“Script error.”,”", 0
浏览器之所以做这样的处理,是考虑到两个特性:
•<script> 能执⾏⾮同源下的第三⽅js⽂件。
•<script> 元素会忽略加载的⽂件的MIME类型,⽽当作脚本来执⾏。
在攻击场景中,恶意页⾯引⼊了正常页⾯的js⽂件,js⽂件会⾃动执⾏,若发⽣异常触发的报错信息,可能会泄漏某些敏感数据。这些信息最终会被恶意页⾯的r处理。
经测试,存在此特性的浏览器(当前最新版)有Firefox、Chrome、Safari、Opera。
简⾔之,当在页⾯中 <script> 引⼊外部js⽂件时,增加⼀个属性crossorigin(类似于<img> 的CROS属性)。服务器在接受到请求时,在HTTP Header⾥增加⼀个授权字段(值可以是具体的某个域名):
Access-Control-Allow-Origin: *
浏览器检测到此js已经授权此页⾯所在域名,则不⽤再篡改由此js传递到r的错误信息了。
经测试,此⽅案尚未被浏览器实现。
已经在Chrome、Firefox的较新版本中⽀持。
其他参考资料
window.下⾯是⼀些实例⼤家可以参考下:
onerror = function(sMessage,sUrl,sLine){};
onerror函数的三个参数⽤于确定错误确切的信息,代表的意思依次为:错误信息;发⽣错误的⽂件;发⽣错误的⾏号。
⽰例:
<SCRIPT>
function fnErrorTrap(sMsg,sUrl,sLine){
oErrorLog.innerHTML="<b>An error was thrown and caught.</b><p>";
oErrorLog.innerHTML+="Error: " + sMsg + "<br>";
oErrorLog.innerHTML+="Line: " + sLine + "<br>";
oErrorLog.innerHTML+="URL: " + sUrl + "<br>";
return false;
}
function fnThrow(){
eval(oErrorCode.value);
}
</SCRIPT>
<INPUT TYPE="text" ID=oErrorCode VALUE="someObject.someProperty=true;">
<INPUT TYPE="button" VALUE="Throw Error" onclick="fnThrow()">
<P>
<DIV ID="oErrorLog">
</DIV>
上⾯⽰例的⽅法很值得借鉴。
捕获js错误时,我们通常使⽤try{}catch(e){}的⽅式,然后通过e.errorMessage等⽅式获取错误信息然后报告错误。但对于onerror事件可能很少问津,我们是否思考过如何报告错误所在的⾏号?如果想过这个是否也被这个问题所困扰过,是否认为在js⾥不可能捕获错误的⾏号呢?其实本⼈就遇到上述的⼏个问题,今⽇读某⼈写的⼀段js代码顿然发现了onerror事件,要说onerror这个时间也是n久以前就知道了,但对于其所带有的三个参数和其特殊性质却⼀直没有去了解过。经过⾃⼰的研究测试,对onerror事件有了⼀些新的认识和了解。在页⾯没有错误时,r事件是不存在的,也就是null(废话!没出错如果onerror出现还正常吗?)我们⼀般通过函数名传递的⽅式(引⽤的⽅式)将要执⾏的操作函数传递给onerror事件,如r=r=function(){alert('error')},但我们可能不知道该事件触发时还带有三个默认的参数,他们分别是错误信息,错误页⾯的url和错误⾏号。要知道这个可是事件,就如onclick和onmouseover等事件⼀样,但它是有参数。我们可以这样测试。
<script type="text/javascript">
当前页面脚本发生错误function testError(){
arglen=arguments.length;
var errorMsg="参数个数:"+arglen+"个";
for(var i=0;i<arglen;i++){
errorMsg+="/n参数"+(i+1)+":"+arguments[i];
}
alert(errorMsg);
return true;
}
function test(){
error
}
test()
</script>
⾸先将testError⽅法绑定给onerror事件,然后在test⽅法⾥触发⼀个错误,在IE中执⾏时我们发现如下提⽰:
--------------------------- Microsoft Internet Explorer ---------------------------
参数个数:3个
参数1:'error' 未定义
参数2:file://E:/yanwei/test/testError.html
参数3:14
--------------------------- 确定 ---------------------------
可以发现,当出错时函数testError捕获到了三个参数。通过将函数绑定到onerror事件就可以在页⾯出错时捕获以上三个参数。在测试中还发现以下⼀些问题:
1、通过在函数末尾加上return true,可以在函数出错时不会弹出系统的错误信息(IE)。
2、如果页⾯出现多次错误,只捕获第⼀次错误并进⾏处理然后终⽌后⾯程序的执⾏。
3、onerror事件并不能捕获所有的错误,只能捕获函数外或函数内错误(??这个是什么意思,可不是开玩笑呢),如
adasdf; function test(){ aaaa; } 可以捕获到adasdf未定义的错误 function test(){ aaaa; } 可以捕获到aaaa未定义的错误,⽽对于functiona test(){}或function test()dd{} 的错误却不能捕获⽽会直接弹出系统错误信息。
4、onerror在IE和FF等浏览器执⾏⽅式是⼀样的,⽽且都包含这三个参数。