网站地图    收藏   

主页 > 前端 > javascript >

Javascript中window.onerror使用方法详解

来源:自学PHP网    时间:2023-02-23 09:22 作者: 阅读:

[导读] window.onerror在js中可以为我们做很多有用的事情,下面我来介绍window.onerror使用方法,有需要了解的同学不防进入参考。...

语法使用onerror 默认有三个入参:

•msg: 错误信息

•url:错误所在文件

•line: 错误所在代码行,整型

123 window.onerror = function(msg, url, line){   // some code };

对于 <body onerror=&rdquo;some code&rdquo;>形式的,可以通过arguments[0]、arguments[1]、arguments[2]依次获取参数。


基本特性

可以通过设置returnValue=true,或直接return true来阻止浏览器显示错误信息。但不会阻止script debuggers弹出的调试框。


只有运行错误才会触发onerror,语法错误不会触发。


以下三种方式可以引发onerror:


&bull;运行时错误,例如无效的对象引用或安全限制

&bull;下载错误,如图片

&bull;在IE9中,获取多媒体数据失败也会引发

<script> 标签不支持onerror。


定义在 <body> 标签上的onerror属性相当于window.onerror (经测试,Firefox、Opera支持,IE9、chrome无反应)。


浏览器兼容性

QuirksMode列出的各浏览器对onError的支持情况:


&bull;Chrome 13+

&bull;Firefox 6.1+

&bull;Internet Explorer 5.5+

&bull;Safari 5.1+

&bull;Opera 11.61+ (QuirksMode 测试到11.51尚不支持,我手头上的11.61已支持)

除window对象外,支持 onerror 的元素:


&bull;<img> 全支持

&bull;<script> IE9/IE10/safari 5.1+/chrome 13+ 支持

<css> 和 <iframe> 不支持onerror。


问题与解决方案

对于引用外部js文件中的错误,Webkit和Mozilla类浏览器会篡改原始的错误信息,导致最后onerror获取到的三个入参为:


&ldquo;Script error.&rdquo;,&rdquo;", 0


例如http://www.111cn.net,引入了http://b.com/g.js,如果g.js出错,最终传递到window.onerror的信息会被篡改。


浏览器之所以做这样的处理,是考虑到两个特性:


&bull;<script> 能执行非同源下的第三方js文件。

&bull;<script> 元素会忽略加载的文件的MIME类型,而当作脚本来执行。

在攻击场景中,恶意页面引入了正常页面的js文件,js文件会自动执行,若发生异常触发的报错信息,可能会泄漏某些敏感数据。这些信息最终会被恶意页面的window.onerror处理。


经测试,存在此特性的浏览器(当前最新版)有Firefox、Chrome、Safari、Opera。


Adam Barth(work on the security of the Chrome browser at Google)建议的解决方案是使用CORS (Cross-Origin Resource Sharing)。


简言之,当在页面中 <script> 引入外部js文件时,增加一个属性crossorigin(类似于<img> 的CROS属性)。服务器在接受到请求时,在HTTP Header里增加一个授权字段(值可以是具体的某个域名):


Access-Control-Allow-Origin: *


浏览器检测到此js已经授权此页面所在域名,则不用再篡改由此js传递到window.onerror的错误信息了。


经测试,此方案尚未被浏览器实现。

已经在Chrome、Firefox的较新版本中支持。


错误不触发onerror的情况

不过如果手动去try并catch了这个错误,不继续抛出的话此错误并不会触发onerror。


 


例如:



try{sdflkjwef}catch(e){...//没有继续抛出错误}


这样这个错误不会触发onerror事件


 try{sdflkjwef}catch(e){... throw e;}


继续抛出这个错误就可以触发onerror事件


 

IE下屏蔽错误出现


在onerror的回调方法最后如果返回值如果是true则在IE下可以避过浏览器左下角感叹号的出现,同时错误收集仍然继续


window.onerror = function(sMessage,sUrl,sLine){};


onerror函数的三个参数用于确定错误确切的信息,代表的意思依次为:错误信息;发生错误的文件;发生错误的行号。


示例:

<SCRIPT>
window.onerror=fnErrorTrap;
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事件有了一些新的认识和了解。在页面没有错误时,window.onerror事件是不存在的,也就是null(废话!没出错如果onerror出现还正常吗?)我们一般通过函数名传递的方式(引用的方式)将要执行的操作函数传递给onerror事件,如window.onerror=reportError;window.onerror=function(){alert('error')},但我们可能不知道该事件触发时还带有三个默认的参数,他们分别是错误信息,错误页面的url和错误行号。要知道这个可是事件,就如onclick和onmouseover等事件一样,但它是有参数。我们可以这样测试。


<script type="text/javascript">  
    window.onerror=testError;  
    function testError(){  
    arglen=arguments.length;  
    var errorMsg="参数个数:"+arglen+"个";  
    for(var i=0;i<arglen;i++){  
    errorMsg+="/n参数"+(i+1)+":"+arguments[i];  
}  
    alert(errorMsg);  
    window.onerror=null;  
    return true;  
}  
function test(){  
    error  
}  
test()  
</script>

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论