window屬性:onerror

2018-05-03 10:41 更新

onerror屬性

onerror屬性表示error事件的事件處理程序的。針對(duì)不同類型的錯(cuò)誤,在不同的目標(biāo)上激發(fā)error事件:

  • 當(dāng)發(fā)生JavaScript運(yùn)行時(shí)錯(cuò)誤(包括處理程序中引發(fā)的語法錯(cuò)誤和異常)時(shí),使用接口ErrorEvent的error事件將在window被觸發(fā)并被window.onerror()調(diào)用(以及由window.addEventListener連接的處理程序)。
  • 當(dāng)一個(gè)資源(如<img>or <script>)加載失敗時(shí),使用接口Event的error事件觸發(fā)啟動(dòng)加載的元素,并調(diào)用元素上的onerror()處理程序。這些錯(cuò)誤事件不會(huì)冒泡到window,但是(至少在Firefox中)可以通過單個(gè)捕獲window.addEventListener來處理。

安裝全局error事件處理程序?qū)τ谧詣?dòng)收集錯(cuò)誤報(bào)告非常有用。

onerror屬性語法

由于歷史的原因,不同的參數(shù)被傳遞給window.onerror和element.onerror處理程序(以及關(guān)于錯(cuò)誤類型window.addEventListener的處理程序)。

window.onerror

window.onerror = function(message, source, lineno, colno, error) { ... }

參數(shù):

  • message:錯(cuò)誤消息(字符串)。在HTML onerror=""處理程序event(sic?。┲锌捎谩?/li>
  • source:引發(fā)錯(cuò)誤的腳本的URL(字符串)
  • lineno:發(fā)生錯(cuò)誤的行號(hào)(數(shù)值)
  • colno:發(fā)生錯(cuò)誤的行的列號(hào)(數(shù)值)
  • error:錯(cuò)誤對(duì)象(對(duì)象)

當(dāng)函數(shù)返回true時(shí),這可以防止觸發(fā)默認(rèn)事件處理程序。

window.addEventListener( 'error')

window.addEventListener('error', function(event) { ... })

ErrorEvent類型的事件包含有關(guān)事件和錯(cuò)誤的所有信息。

element.onerror

element.onerror = function(event) { ... }

element.onerror接受一個(gè)Event類型的單個(gè)參數(shù)的函數(shù)。

一個(gè)很好的例子就是當(dāng)你使用一個(gè)圖像標(biāo)簽時(shí),并且需要指定一個(gè)備份映像,以防您需要的服務(wù)器因任何原因而無法使用。

<img src="imagenotfound.gif" onerror="this.onerror=null;this.src='imagefound.gif';" />

我們?cè)诤瘮?shù)中使用this.onerror=null的原因 是,如果onerror圖像本身產(chǎn)生錯(cuò)誤,瀏覽器將陷入無限循環(huán)。

筆記

當(dāng)從不同來源加載的腳本中發(fā)生語法錯(cuò)誤時(shí),不會(huì)報(bào)告語法錯(cuò)誤的詳細(xì)信息,這樣可以防止泄漏信息。相反,報(bào)告的錯(cuò)誤只是"Script error"。這種行為可以在某些瀏覽器中使用<script>中的crossorigin屬性來重寫,并讓服務(wù)器發(fā)送相應(yīng)的CORS HTTP響應(yīng)標(biāo)頭。解決方法是隔離“Script error”,并處理它,并且知道錯(cuò)誤細(xì)節(jié)僅在瀏覽器控制臺(tái)中可見而不能通過JavaScript訪問。

window.onerror = function (msg, url, lineNo, columnNo, error) {
    var string = msg.toLowerCase();
    var substring = "script error";
    if (string.indexOf(substring) > -1){
        alert('Script Error: See Browser Console for Detail');
    } else {
        var message = [
            'Message: ' + msg,
            'URL: ' + url,
            'Line: ' + lineNo,
            'Column: ' + columnNo,
            'Error object: ' + JSON.stringify(error)
        ].join(' - ');

        alert(message);
    }

    return false;
};

當(dāng)使用內(nèi)嵌HTML標(biāo)記時(shí)(<body onerror="alert('an error occurred')">),HTML規(guī)范要求傳遞給onerror的參數(shù)被命名為event,source,lineno,colno,error。在還沒有實(shí)現(xiàn)這一要求的瀏覽器,他們?nèi)匀豢梢酝ㄟ^arguments[2]獲得arguments[0]。

規(guī)范

規(guī)范 狀態(tài) 注釋
HTML Living Standard 
在這個(gè)規(guī)范中定義了'onerror'。
Living Standard
 

瀏覽器兼容性

在Firefox 14中,<script>加載失敗之前, window.onerror調(diào)用了消息“Error loading script”。這在bug 737087中得到修復(fù),現(xiàn)在 scriptElement.onerror在這種情況下被調(diào)用。

自Firefox 31以來,最后2個(gè)參數(shù)(colno和error)被添加,這意味著您可以通過提供的Error對(duì)象從window.onerror訪問腳本錯(cuò)誤的堆棧跟蹤。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)