国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

window.onerror()的用法與實例分析

2024-05-06 16:27:56
字體:
來源:轉載
供稿:網友
目前在做window.onerror時上報js錯誤信息的事,整理下相關資料,需要的朋友可以參考下
 

onerror語法使用

onerror 默認有三個入參:

•msg: 錯誤信息
•url:錯誤所在文件
•line: 錯誤所在代碼行,整型
window.onerror = function(msg, url, line){ // some code }; 
對于 <body onerror=”some code”>形式的,可以通過arguments[0]、arguments[1]、arguments[2]依次獲取參數。

js中我們最常用的就是js容錯

window.onerror=function(){return true;}

 

基本特性
可以通過設置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文件中的錯誤, 復制代碼代碼如下:


“Script error.”,”", 0

 

例如http://a.com/index.html,引入了http://b.com/g.js,如果g.js出錯,最終傳遞到window.onerror的信息會被篡改。

瀏覽器之所以做這樣的處理,是考慮到兩個特性:

•<script> 能執行非同源下的第三方js文件。
•<script> 元素會忽略加載的文件的MIME類型,而當作腳本來執行。
在攻擊場景中,惡意頁面引入了正常頁面的js文件,js文件會自動執行,若發生異常觸發的報錯信息,可能會泄漏某些敏感數據。這些信息最終會被惡意頁面的window.onerror處理。

經測試,存在此特性的瀏覽器(當前最新版)有Firefox、Chrome、Safari、Opera。

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

首先將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等瀏覽器執行方式是一樣的,而且都包含這三個參數。



注:相關教程知識閱讀請移步到
JavaScript/Ajax教程頻道。
上一篇:再談JavaScript異步編程

下一篇:javascript鼠標右鍵菜單自定義效果

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片
猜你喜歡的新聞
猜你喜歡的關注

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 宜兴市| 资溪县| 南江县| 沁水县| 昌都县| 搜索| 阿拉善右旗| 吴江市| 漠河县| 太谷县| 阜平县| 兰坪| 金阳县| 广元市| 株洲市| 广河县| 夏河县| 屏山县| 绥棱县| 科尔| 广水市| 论坛| 韶山市| 社旗县| 宁强县| 滦平县| 满洲里市| 兴义市| 甘德县| 阿鲁科尔沁旗| 岳西县| 吉安市| 襄樊市| 靖西县| 仁布县| 余庆县| 莱州市| 玉田县| 那坡县| 玉门市| 广昌县|