Javascript中window.onerror使用方法详解

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

•msg: 错误信息
•url:错误所在文件
•line: 错误所在代码行,整型
123 window.onerror = function(msg, url, line){   // some code };
对于 <body onerror=”some code”>形式的,可以通过arguments[0]、arguments[1]、arguments[2]依次获取参数。

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

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

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

•运行时错误,例如无效的对象引用或安全限制
•下载错误,如图片
•在IE9中,获取多媒体数据失败也会引发
<script> 标签不支持onerror。

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

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

•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。

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

“Script error.”,”", 0

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

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

•<script> 能执行非同源下的第三方js文件。
•<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>
时间: 2024-10-28 02:46:38

Javascript中window.onerror使用方法详解的相关文章

JavaScript中window.open用法实例详解_javascript技巧

本文较为详细的分析了JavaScript中window.open用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: <script LANGUAGE="javascript"> window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no,resizable=no,location=no, sta

javascript中定义类的方法详解

 这篇文章主要详细介绍了javascript中定义类的方法的相关资料,需要的朋友可以参考下     JS中定义类的方式有很多种: 1.工厂方式   代码如下: function Car(){ var ocar = new Object; ocar.color = "blue"; ocar.doors = 4; ocar.showColor = function(){ document.write(this.color) }; return ocar; } var car1 = Car(

JavaScript中this关键字使用方法详解

javascript|关键字|详解 在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaScript也提供了这个this关键字,不过用起来就比经典OO语言中要"混乱"的多了.     下面就来看看,在JavaScript中各种this的使用方法有什么混乱之处?     1.在HTML元素事件属性中inline方式使用this关键字:  <div

javascript中window.event事件用法详解_基础知识

前两天写程序时因为要用到javascript中的window.event事件,于是就在网上搜了一下,终于找到一篇不错的文章,来与大家分享下: 描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromElement 和 toElement 属性只对 onmouseover 和 onmouseout 事件有意义. 例子下面的例子检查鼠标是否在链接上单击,并且,如

JavaScript中split()方法详解

split()方法在js处理字符串是很常见,也是很重要的一种方法必须熟练掌握 split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separator,howmany) 参数描述 separator参数:必需填.字符串或正则表达式,从该参数指定的地方分割 stringObject. howmany参数:可选.该参数可指定返回的数组的最大长度.如果设置了该参数,返回的子串不会多于这个参数指定的数组.如果没有设置该参数,整个字符串都会被分割,不考虑它的长

javaScript中的this示例学习详解及工作原理

 这篇文章主要介绍了javaScript中的this示例学习详解及工作原理,大家参考使用吧 this的工作原理   如果一个函数被作为一个对象的方法调用,那么this将被指派为这个对象.   代码如下: var parent = {     method: function () {         console.log(this);     } };   parent.method(); // <- parent       注意这种行为非常"脆弱",如果你获取一个方法的引用

JavaScript中浅讲ajax图文详解_javascript技巧

1.ajax入门案例 1.1 搭建Web环境 ajax对于各位来说,应该都不陌生,正因为ajax的产生,导致前台页面和服务器之间的数据传输变得非常容易,同时还可以实现页面的局部刷新.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 对于JavaWeb项目而言,ajax主要用于浏览器和服务器之间数据的传输. 如果是单单地堆砌知识点,会显得比较无聊,那么根据惯例,我先不继续介绍ajax,而是来写一个案例吧. 打开

Android中XUtils3框架使用方法详解(一)_Android

xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响... xUitls 最低兼容android 2.2 (api level 8) 今天给大家带来XUtils3的基本介绍,本文章的案例都是基于XUtils3的API语法进行的演示.相信大家对这个框架也都了解过, 下面简单介绍下XUtils3的一些基本知识. XUtils3一共有4大功能:注解模块,网络

JavaScript中push(),join() 函数 实例详解_javascript技巧

定义和用法 push方法 可向数组的末尾添加一个或多个元素,并返回一个新的长度. join方法 用于把数组中所有元素添加到一个指定的字符串,元素是通过指定的分隔符进行分割的. 语法 arrayObject.push(newelement1,newelement2,....,newelementX) arrayObject.join(separator). 参数描述newelement1必需.要添加到数组的第一个元素.newelement2可选.要添加到数组的第二个元素.newelementX可选