window.onerror()的用法與實(shí)例分析
onerror語法使用
onerror 默認(rèn)有三個(gè)入?yún)ⅲ?/p>
•msg: 錯(cuò)誤信息
•url:錯(cuò)誤所在文件
•line: 錯(cuò)誤所在代碼行,整型
window.onerror = function(msg, url, line){ // some code };
對(duì)于 <body onerror=”some code”>形式的,可以通過arguments[0]、arguments[1]、arguments[2]依次獲取參數(shù)。
js中我們最常用的就是js容錯(cuò)
window.onerror=function(){return true;}
基本特性
可以通過設(shè)置returnValue=true,或直接return true來阻止瀏覽器顯示錯(cuò)誤信息。但不會(huì)阻止script debuggers彈出的調(diào)試框。
只有運(yùn)行錯(cuò)誤才會(huì)觸發(fā)onerror,語法錯(cuò)誤不會(huì)觸發(fā)。
以下三種方式可以引發(fā)onerror:
•運(yùn)行時(shí)錯(cuò)誤,例如無效的對(duì)象引用或安全限制
•下載錯(cuò)誤,如圖片
•在IE9中,獲取多媒體數(shù)據(jù)失敗也會(huì)引發(fā)
<script> 標(biāo)簽不支持onerror。
定義在 <body> 標(biāo)簽上的onerror屬性相當(dāng)于window.onerror (經(jīng)測(cè)試,F(xiàn)irefox、Opera支持,IE9、chrome無反應(yīng))。
瀏覽器兼容性
QuirksMode列出的各瀏覽器對(duì)onError的支持情況
•Chrome 13+
•Firefox 6.1+
•Internet Explorer 5.5+
•Safari 5.1+
•Opera 11.61+ (QuirksMode 測(cè)試到11.51尚不支持,我手頭上的11.61已支持)
除window對(duì)象外,支持 onerror 的元素:
•<img> 全支持
•<script> IE9/IE10/safari 5.1+/chrome 13+ 支持
<css> 和 <iframe> 不支持onerror。
問題與解決方案
對(duì)于引用外部js文件中的錯(cuò)誤,Webkit和Mozilla類瀏覽器會(huì)篡改原始的錯(cuò)誤信息,導(dǎo)致最后onerror獲取到的三個(gè)入?yún)椋?/p>
“Script error.”,”", 0
例如http://a.com/index.html,引入了http://b.com/g.js,如果g.js出錯(cuò),最終傳遞到window.onerror的信息會(huì)被篡改。
瀏覽器之所以做這樣的處理,是考慮到兩個(gè)特性:
•<script> 能執(zhí)行非同源下的第三方j(luò)s文件。
•<script> 元素會(huì)忽略加載的文件的MIME類型,而當(dāng)作腳本來執(zhí)行。
在攻擊場(chǎng)景中,惡意頁面引入了正常頁面的js文件,js文件會(huì)自動(dòng)執(zhí)行,若發(fā)生異常觸發(fā)的報(bào)錯(cuò)信息,可能會(huì)泄漏某些敏感數(shù)據(jù)。這些信息最終會(huì)被惡意頁面的window.onerror處理。
經(jīng)測(cè)試,存在此特性的瀏覽器(當(dāng)前最新版)有Firefox、Chrome、Safari、Opera。
Adam Barth(work on the security of the Chrome browser at Google)建議的解決方案是使用CORS (Cross-Origin Resource Sharing)。
簡(jiǎn)言之,當(dāng)在頁面中 <script> 引入外部js文件時(shí),增加一個(gè)屬性crossorigin(類似于<img> 的CROS屬性)。服務(wù)器在接受到請(qǐng)求時(shí),在HTTP Header里增加一個(gè)授權(quán)字段(值可以是具體的某個(gè)域名):
Access-Control-Allow-Origin: *
瀏覽器檢測(cè)到此js已經(jīng)授權(quán)此頁面所在域名,則不用再篡改由此js傳遞到window.onerror的錯(cuò)誤信息了。
經(jīng)測(cè)試,此方案尚未被瀏覽器實(shí)現(xiàn)。
已經(jīng)在Chrome、Firefox的較新版本中支持。
其他參考資料
Internet Explorer http://msdn.microsoft.com/en-us/library/cc197053.aspx
Mozilla Firefox https://developer.mozilla.org/en/DOM/window.onerror
Opera http://dev.opera.com/articles/view/better-error-handling-with-window-onerror/
Wiki http://www.w3.org/wiki/DOM/window.onerror
syntax errors and runtime errors http://www.htmlgoodies.com/primers/jsp/article.php/3610081/Javascript-Basics-Part-11.htm
window.下面是一些實(shí)例大家可以參考下:
onerror = function(sMessage,sUrl,sLine){};
onerror函數(shù)的三個(gè)參數(shù)用于確定錯(cuò)誤確切的信息,代表的意思依次為:錯(cuò)誤信息;發(fā)生錯(cuò)誤的文件;發(fā)生錯(cuò)誤的行號(hào)。
示例:
<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錯(cuò)誤時(shí),我們通常使用try{}catch(e){}的方式,然后通過e.errorMessage等方式獲取錯(cuò)誤信息然后報(bào)告錯(cuò)誤。但對(duì)于onerror事件可能很少問津,我們是否思考過如何報(bào)告錯(cuò)誤所在的行號(hào)?如果想過這個(gè)是否也被這個(gè)問題所困擾過,是否認(rèn)為在js里不可能捕獲錯(cuò)誤的行號(hào)呢?其實(shí)本人就遇到上述的幾個(gè)問題,今日讀某人寫的一段js代碼頓然發(fā)現(xiàn)了onerror事件,要說onerror這個(gè)時(shí)間也是n久以前就知道了,但對(duì)于其所帶有的三個(gè)參數(shù)和其特殊性質(zhì)卻一直沒有去了解過。經(jīng)過自己的研究測(cè)試,對(duì)onerror事件有了一些新的認(rèn)識(shí)和了解。在頁面沒有錯(cuò)誤時(shí),window.onerror事件是不存在的,也就是null(廢話!沒出錯(cuò)如果onerror出現(xiàn)還正常嗎?)我們一般通過函數(shù)名傳遞的方式(引用的方式)將要執(zhí)行的操作函數(shù)傳遞給onerror事件,如window.onerror=reportError;window.onerror=function(){alert('error')},但我們可能不知道該事件觸發(fā)時(shí)還帶有三個(gè)默認(rèn)的參數(shù),他們分別是錯(cuò)誤信息,錯(cuò)誤頁面的url和錯(cuò)誤行號(hào)。要知道這個(gè)可是事件,就如onclick和onmouseover等事件一樣,但它是有參數(shù)。我們可以這樣測(cè)試。
<script type="text/javascript">
window.onerror=testError;
function testError(){
arglen=arguments.length;
var errorMsg="參數(shù)個(gè)數(shù):"+arglen+"個(gè)";
for(var i=0;i<arglen;i++){
errorMsg+="/n參數(shù)"+(i+1)+":"+arguments[i];
}
alert(errorMsg);
window.onerror=null;
return true;
}
function test(){
error
}
test()
</script>
首先將testError方法綁定給onerror事件,然后在test方法里觸發(fā)一個(gè)錯(cuò)誤,在IE中執(zhí)行時(shí)我們發(fā)現(xiàn)如下提示:
--------------------------- Microsoft Internet Explorer ---------------------------
參數(shù)個(gè)數(shù):3個(gè)
參數(shù)1:'error' 未定義
參數(shù)2:file://E:/yanwei/test/testError.html
參數(shù)3:14
--------------------------- 確定 ---------------------------
可以發(fā)現(xiàn),當(dāng)出錯(cuò)時(shí)函數(shù)testError捕獲到了三個(gè)參數(shù)。通過將函數(shù)綁定到onerror事件就可以在頁面出錯(cuò)時(shí)捕獲以上三個(gè)參數(shù)。
在測(cè)試中還發(fā)現(xiàn)以下一些問題:
1、通過在函數(shù)末尾加上return true,可以在函數(shù)出錯(cuò)時(shí)不會(huì)彈出系統(tǒng)的錯(cuò)誤信息(IE)。
2、如果頁面出現(xiàn)多次錯(cuò)誤,只捕獲第一次錯(cuò)誤并進(jìn)行處理然后終止后面程序的執(zhí)行。
3、onerror事件并不能捕獲所有的錯(cuò)誤,只能捕獲函數(shù)外或函數(shù)內(nèi)錯(cuò)誤(??這個(gè)是什么意思,可不是開玩笑呢),如 adasdf; function test(){ aaaa; } 可以捕獲到adasdf未定義的錯(cuò)誤 function test(){ aaaa; } 可以捕獲到aaaa未定義的錯(cuò)誤,而對(duì)于functiona test(){}或function test()dd{} 的錯(cuò)誤卻不能捕獲而會(huì)直接彈出系統(tǒng)錯(cuò)誤信息。
4、onerror在IE和FF等瀏覽器執(zhí)行方式是一樣的,而且都包含這三個(gè)參數(shù)。
相關(guān)文章
javascript權(quán)威指南 學(xué)習(xí)筆記之javascript數(shù)據(jù)類型
JavaScript中允許使用三種基本數(shù)據(jù)類型 數(shù)字,文本字符和布爾值。其中數(shù)字包括符點(diǎn)數(shù).此外,它還支持兩種小數(shù)據(jù)類型 -null(空)和undefined(未定義),該兩種小數(shù)據(jù)類型,它們各自只定義了一個(gè)值 。2011-09-09
JavaScript中的事件循環(huán)機(jī)制及其運(yùn)行原理
JavaScript中的事件循環(huán)機(jī)制是一種異步處理機(jī)制,通過維護(hù)事件隊(duì)列和消息隊(duì)列,實(shí)現(xiàn)任務(wù)的分發(fā)和執(zhí)行。事件循環(huán)機(jī)制由主線程和任務(wù)隊(duì)列構(gòu)成,主線程運(yùn)行完當(dāng)前任務(wù)后會(huì)檢查任務(wù)隊(duì)列中是否有待執(zhí)行的任務(wù),如有則執(zhí)行,否則等待2023-04-04
js自動(dòng)閉合html標(biāo)簽(自動(dòng)補(bǔ)全html標(biāo)記)
假如我有一個(gè)DIV,如果沒有閉合后面的樣式都會(huì)亂了,這樣的代碼可能會(huì)影響后面的樣式,我希望用JS去自動(dòng)閉合這種沒有閉合的標(biāo)簽2012-10-10
JS如何獲取瀏覽器聲音、麥克風(fēng)以及通知權(quán)限
在我們開發(fā)網(wǎng)頁的時(shí)候偶爾會(huì)有需要用戶錄音的情況,下面這篇文章主要給大家介紹了關(guān)于JS如何獲取瀏覽器聲音、麥克風(fēng)以及通知權(quán)限的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
javascript面向?qū)ο笾畉his關(guān)鍵詞用法分析
這篇文章主要介紹了javascript面向?qū)ο笾畉his關(guān)鍵詞用法分析,以實(shí)例形式分析了在不同場(chǎng)合下this使用中的特性及相關(guān)使用技巧,需要的朋友可以參考下2015-01-01
由JavaScript中call()方法引發(fā)的對(duì)面向?qū)ο罄^承機(jī)制call的思考
看到這里的call()方法,以前也看過手冊(cè),說是對(duì)象冒充的,用于繼承的。在jQuery源碼里有點(diǎn)亂,所以就把這部分提取出來,放在一個(gè)單獨(dú)文件中,來看看具體執(zhí)行。2011-09-09
聊聊那些使用前端Javascript實(shí)現(xiàn)的機(jī)器學(xué)習(xí)類庫
本文介紹了前端Javascript實(shí)現(xiàn)的機(jī)器學(xué)習(xí)類庫,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09

