最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年01月27日 13:13:48   投稿:mdxy-dxy  
目前在做window.onerror時(shí)上報(bào)js錯(cuò)誤信息的事,整理下相關(guān)資料,需要的朋友可以參考下

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ò)誤,WebkitMozilla類瀏覽器會(huì)篡改原始的錯(cuò)誤信息,導(dǎo)致最后onerror獲取到的三個(gè)入?yún)椋?/p>

復(fù)制代碼 代碼如下:

“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)文章

最新評(píng)論

新丰县| 嘉兴市| 北碚区| 玉树县| 江陵县| 阿拉善右旗| 高台县| 台湾省| 琼结县| 平乐县| 赤峰市| 上栗县| 伊吾县| 阳山县| 罗平县| 尼木县| 项城市| 崇义县| 太谷县| 莱阳市| 新建县| 仪陇县| 库尔勒市| 金山区| 额尔古纳市| 辽宁省| 雷州市| 明星| 阜城县| 滕州市| 大丰市| 乌鲁木齐县| 临洮县| 翁牛特旗| 莱州市| 宝应县| 锦屏县| 阿鲁科尔沁旗| 锡林郭勒盟| 青龙| 沁源县|