欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端監(jiān)控頁面異常的常用方法

 更新時(shí)間:2025年04月20日 08:37:16   作者:sevenliao  
前端開發(fā)常見問題之一: 資源異常、js異常,頁面出了問題常見的想法是:如何看到錯(cuò)誤信息,資源腳本是否正常,像js、css、圖片這些資源文件經(jīng)常受網(wǎng)絡(luò)等原因,導(dǎo)致資源加載異常,這些會(huì)直接影響我們的頁面,本文給大家介紹前端監(jiān)控頁面異常的常用方法,需要的朋友可以參考下

前端開發(fā)常見問題之一: 資源異常、js異常;

頁面出了問題常見的想法是:如何看到錯(cuò)誤信息,資源腳本是否正常;

像js、css、圖片這些資源文件經(jīng)常受網(wǎng)絡(luò)等原因,導(dǎo)致資源加載異常,這些會(huì)直接影響我們的頁面; 所以我們也需要有對(duì)資源加載是否正常有監(jiān)控;

1.資源加載錯(cuò)誤監(jiān)控

這塊主要是對(duì)資源加載錯(cuò)誤,找不到文件或者網(wǎng)絡(luò)原因?qū)е沦Y源加載超時(shí)導(dǎo)致的失??;

常用方法:

  • 添加一個(gè)error監(jiān)聽函數(shù)捕獲方法:

該方法是相對(duì)比較推薦,因?yàn)轫撁鎒rror監(jiān)聽函數(shù)可以捕獲到頁面所有移除信息,只需要自行獲取異常信息即可;

參考一個(gè)例子

/** * 監(jiān)控頁面靜態(tài)資源加載報(bào)錯(cuò) */ 
function loadResourceError() { 
    window.addEventListener('error', function(e) { 
        console.log(e, '錯(cuò)誤捕獲==='); 
        if(e){ 
            let target = e.target || e.srcElement; 
            let isElementTarget = target instanceof HTMLElement; 
            if (!isElementTarget) { 
                // js錯(cuò)誤 
                console.log('js錯(cuò)誤==='); 
                // js error處理 
                let { filename, message, lineno, colno, error} = e; 
                let { message: ErrorMsg, stack } = error; 
            }else{ 
                // 頁面靜態(tài)資源加載錯(cuò)誤處理 
                console.log('資源加載錯(cuò)誤==='); 
                let { type, timeStamp, target } = e; 
                let { localName, outerHTML, tagName, src } = target; 
                let typeName = target.localName; 
                let sourceUrl = ""; 
                if (typeName === "link") { 
                    sourceUrl = target.href; 
                } else if (typeName === "script") { 
                    sourceUrl = target.src; 
                } 
                alert('資源加載失敗,請(qǐng)刷新頁面或切換網(wǎng)絡(luò)重試。('+sourceUrl+')') 
             } 
         } 
        // 注意:由于網(wǎng)絡(luò)請(qǐng)求異常不會(huì)事件冒泡,因此必須在捕獲階段才能捕獲到異常;
        // 設(shè)為true表示捕獲階段調(diào)用,會(huì)在元素的onerror前調(diào)用,在window.addEventListener('error')后調(diào)用 
       },true); 
} 
   // 我們根據(jù)e.target的屬性來判斷它是link標(biāo)簽,還是script標(biāo)簽。目前只關(guān)注只監(jiān)控了css,js文件加載錯(cuò)誤的情況。

運(yùn)行結(jié)果

補(bǔ)充一個(gè)知識(shí)點(diǎn):

window.addEventListener('error') 與 window.onerror 有什么區(qū)別?

window.addEventListener('error') 和 window.onerror 都是用來捕獲全局錯(cuò)誤的方法,但它們?cè)谑褂梅绞?、功能特性以及適用場(chǎng)景上有所不同。

定義:

  • window.onerror‌ 是一個(gè)全局事件處理函數(shù),當(dāng)有JavaScript運(yùn)行時(shí)錯(cuò)誤發(fā)生時(shí),會(huì)自動(dòng)調(diào)用該函數(shù)。它接受五個(gè)參數(shù):錯(cuò)誤信息(message)、發(fā)生錯(cuò)誤的腳本URL(source)、行號(hào)(lineno)、列號(hào)(colno)和錯(cuò)誤對(duì)象(error)。如果該函數(shù)返回true,則阻止默認(rèn)的事件處理函數(shù)執(zhí)行;如果返回false或不返回,錯(cuò)誤信息會(huì)在控制臺(tái)中打印‌

  • window.addEventListener('error') ‌ 通過事件監(jiān)聽的方式來捕獲錯(cuò)誤。它可以綁定多個(gè)回調(diào)函數(shù),并且會(huì)按照順序執(zhí)行這些回調(diào)函數(shù)。與window.onerror不同,addEventListener的回調(diào)函數(shù)不會(huì)自動(dòng)執(zhí)行,需要顯式添加。它也可以在捕獲階段捕獲錯(cuò)誤,適用于需要精確控制錯(cuò)誤處理流程的場(chǎng)景‌

功能:

  • 捕獲錯(cuò)誤的范圍‌:window.addEventListener('error') 可以在捕獲階段捕獲錯(cuò)誤,比 window.onerror 更早觸發(fā)。它不僅可以捕獲js運(yùn)行時(shí)錯(cuò)誤,還可以捕獲網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤(如果設(shè)置為在捕獲階段執(zhí)行),但無法捕獲Promise相關(guān)的錯(cuò)誤和資源加載異常‌

  • 錯(cuò)誤處理‌:window.onerror 可以接受多個(gè)參數(shù),提供更詳細(xì)的錯(cuò)誤信息。它可以在錯(cuò)誤發(fā)生時(shí)立即處理,但無法捕獲Promise錯(cuò)誤和資源加載異常。而 window.addEventListener('error') 可以綁定多個(gè)回調(diào)函數(shù),提供更靈活的錯(cuò)誤處理機(jī)制‌

使用:

  • window.onerror‌ 適用于需要立即處理全局JavaScript錯(cuò)誤的場(chǎng)景,尤其是在無法使用try-catch的情況下。它適合簡(jiǎn)單的錯(cuò)誤捕獲和處理,但由于其限制,不適合復(fù)雜的錯(cuò)誤管理和異步錯(cuò)誤處理‌

  • window.addEventListener('error') ‌ 適用于需要更靈活和精確控制錯(cuò)誤處理的場(chǎng)景。它適合復(fù)雜的Web應(yīng)用,特別是那些需要捕獲和處理多種類型錯(cuò)誤的場(chǎng)景。通過在捕獲階段使用,它還可以捕獲網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤,但需要注意同源策略的限制‌

  • performance.getEntries()方法:

可以獲取到當(dāng)前所有加載成功的資源列表。 然后在onload事件中遍歷出所有資源集合。 再從所有列表中過濾出成功的資源列表,剩下的就是加載失敗的資源;

雖然能排查出一些加載失敗的靜態(tài)資源,但受到檢查時(shí)機(jī)的影響,還有遇到遇到異步加載的js也沒有辦法處理;

看個(gè)例子

// 瀏覽器獲取網(wǎng)頁時(shí)會(huì)對(duì)網(wǎng)頁中每一個(gè)對(duì)象(腳本文件、樣式表、圖片文件等等)發(fā)出一個(gè)HTTP請(qǐng)求。而通過window.performance.getEntries方法,則可以以數(shù)組形式,返回這些請(qǐng)求的時(shí)間統(tǒng)計(jì)信息,每個(gè)數(shù)組成員均是一個(gè)PerformanceResourceTiming對(duì)象! 
//原理是通過捕獲瀏覽器發(fā)出的http請(qǐng)求信息
function performanceGetEntries(){ 
    // 判斷瀏覽器是否支持 
    if (!window.performance && !window.performance.getEntries) { 
        return false; 
    } 

    var result = []; 
    // 獲取當(dāng)前頁面所有請(qǐng)求對(duì)應(yīng)的PerformanceResourceTiming對(duì)象進(jìn)行分析 
    window.performance.getEntries().forEach((item) => { 
        result.push({ 
            'url': item.name, 
            'entryType': item.entryType, 
            'type': item.initiatorType, 
            'duration(ms)': item.duration 
         }); 
    }); 
    // 控制臺(tái)輸出統(tǒng)計(jì)結(jié)果 
    console.table(result); // 表示已經(jīng)加載的資源  -這是加載成功的列表
    
   //一個(gè)最簡(jiǎn)單的方法是數(shù)量相差得出失敗的數(shù)量
   // 然后把整個(gè)資源的數(shù)量減去已經(jīng)加載好的資源,剩下的就是沒有加載出來的資源的數(shù)量。 
}

運(yùn)行效果

  • onerror 方法:

指定具體的靜態(tài)資源,如某個(gè)圖片元素

圖片:
let image = document.getElementByid('#img')
image.onerror = (e)=>{
    //錯(cuò)誤信息
    console.log(e)
}

js腳本
let script = document.createElement('script');
script.onload = function() {
    console.log('腳本加載成功');
    // 腳本加載成功后的操作
};
script.onerror = function() {
    console.error('腳本加載失敗');
    // 腳本加載失敗后的操作
};

2. js邏輯異常

  • 代碼邏輯中

直接用try catch獲取js錯(cuò)誤信息和上報(bào)

在可能拋出異常的代碼塊使用try……catch結(jié)構(gòu),可以捕獲并處理這些錯(cuò)誤;

try {
    // 嘗試執(zhí)行的代碼
    someFunctionThatMightThrow();
} catch (error) {
    // 錯(cuò)誤處理
    console.error('捕獲到錯(cuò)誤:', error);
    reportError(error); // 自定義的錯(cuò)誤上報(bào)函數(shù)
}
  • 全局錯(cuò)誤監(jiān)聽

為整個(gè)JavaScript環(huán)境添加全局錯(cuò)誤監(jiān)聽器,可以捕獲未被捕獲的異常。即 window.onerror方法, 由于上面已經(jīng)介紹過,這里就重復(fù)介紹;

window.onerror = function(message, source, lineno, colno, error) {
    console.error('全局錯(cuò)誤捕獲:', message, '在', source, '行', lineno);
    reportError(message, source, lineno); // 自定義的錯(cuò)誤上報(bào)函數(shù)
    return false; // 返回false阻止默認(rèn)的錯(cuò)誤頁面顯示
};
  • 添加error監(jiān)方法

使用window.addEventListener監(jiān)聽捕獲異常,上面已經(jīng)介紹過,這里就不重復(fù)介紹;

window.addEventListener('error', function(event) {
    var message = event.message;
    var filename = event.filename || event.filename;
    var lineno = event.lineno;
    var colno = event.colno;
    var error = event.error; // Error object if available
 
    console.error('未捕獲的異常:', message, '在', filename, '行', lineno);
    reportError(message, filename, lineno); // 自定義的錯(cuò)誤上報(bào)函數(shù)
}, true); // 使用capture參數(shù)為true來捕獲事件冒泡階段的事件
  • 使用第三方sdk

總結(jié)

前端監(jiān)控頁面異常設(shè)計(jì)的時(shí)候,可以考慮:1.window.addEventListener ;2.window.onerror;

都可以覆蓋資源加載異常和業(yè)務(wù)邏輯異常

到此這篇關(guān)于前端監(jiān)控頁面異常的常用方法的文章就介紹到這了,更多相關(guān)前端監(jiān)控頁面異常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript中new操作符使用詳解

    JavaScript中new操作符使用詳解

    new操作符是JavaScript中創(chuàng)建對(duì)象實(shí)例的重要方式,理解new操作符的工作原理對(duì)于掌握J(rèn)avaScript的面向?qū)ο缶幊讨陵P(guān)重要,本文將詳細(xì)介紹new操作符的原理及實(shí)現(xiàn),感興趣的小伙伴跟著小編一起來看看吧
    2024-11-11
  • 使用js在layui中實(shí)現(xiàn)上傳圖片壓縮

    使用js在layui中實(shí)現(xiàn)上傳圖片壓縮

    這篇文章主要介紹了使用js在layui中實(shí)現(xiàn)上傳圖片壓縮,layui 是一款采用自身模塊規(guī)范編寫的前端 UI 框架,js上傳圖片壓縮百度有很多方法,,需要的朋友可以參考下
    2019-06-06
  • javascript基于DOM實(shí)現(xiàn)省市級(jí)聯(lián)下拉框的方法

    javascript基于DOM實(shí)現(xiàn)省市級(jí)聯(lián)下拉框的方法

    這篇文章主要介紹了javascript基于DOM實(shí)現(xiàn)省市級(jí)聯(lián)下拉框的方法,可實(shí)現(xiàn)選擇省份后出現(xiàn)對(duì)應(yīng)城市下拉框選項(xiàng)的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • 基于ES6 Array.of的用法(實(shí)例講解)

    基于ES6 Array.of的用法(實(shí)例講解)

    下面小編就為大家?guī)硪黄贓S6 Array.of的用法(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • 詳解JavaScript堆棧與拷貝

    詳解JavaScript堆棧與拷貝

    本文主要介紹了JavaScript中的堆棧與拷貝,能更好的幫助你理解JS的內(nèi)存機(jī)制,感興趣的同學(xué),一定要認(rèn)真看下
    2021-06-06
  • 原生js實(shí)現(xiàn)each方法實(shí)例代碼詳解

    原生js實(shí)現(xiàn)each方法實(shí)例代碼詳解

    這篇文章主要介紹了原生js實(shí)現(xiàn)each方法,需要的朋友可以參考下
    2019-05-05
  • js實(shí)現(xiàn)3d懸浮效果

    js實(shí)現(xiàn)3d懸浮效果

    本文主要分享了js實(shí)現(xiàn)3d懸浮效果的示例代碼,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • Bootstrap模態(tài)對(duì)話框中顯示動(dòng)態(tài)內(nèi)容的方法

    Bootstrap模態(tài)對(duì)話框中顯示動(dòng)態(tài)內(nèi)容的方法

    今天小編就為大家分享一篇Bootstrap模態(tài)對(duì)話框中顯示動(dòng)態(tài)內(nèi)容的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 為什么js中不推薦使用eval函數(shù)(原因分析)

    為什么js中不推薦使用eval函數(shù)(原因分析)

    'eval'函數(shù)是javascript中的一個(gè)內(nèi)置函數(shù),它的主要作用是將傳入的字符串作為代碼來執(zhí)行,這篇文章主要介紹了為什么js中不推薦使用eval函數(shù),需要的朋友可以參考下
    2023-10-10
  • Typescript中類型兼容的實(shí)現(xiàn)

    Typescript中類型兼容的實(shí)現(xiàn)

    在TypeScript 編程中,類型兼容是最基礎(chǔ)的一道檢查機(jī)制,一旦代碼中出現(xiàn)類型不兼容的表達(dá)式,編譯就會(huì)失敗,本文主要介紹了Typescript中類型兼容的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12

最新評(píng)論