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

前端監(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)致的失?。?/p>

常用方法:

  • 添加一個(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('資源加載失敗,請刷新頁面或切換網(wǎng)絡(luò)重試。('+sourceUrl+')') 
             } 
         } 
        // 注意:由于網(wǎng)絡(luò)請求異常不會(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ò)誤的方法,但它們在使用方式、功能特性以及適用場景上有所不同。

定義:

  • 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ò)誤處理流程的場景‌

功能:

  • 捕獲錯(cuò)誤的范圍‌:window.addEventListener('error') 可以在捕獲階段捕獲錯(cuò)誤,比 window.onerror 更早觸發(fā)。它不僅可以捕獲js運(yùn)行時(shí)錯(cuò)誤,還可以捕獲網(wǎng)絡(luò)請求錯(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ò)誤的場景,尤其是在無法使用try-catch的情況下。它適合簡單的錯(cuò)誤捕獲和處理,但由于其限制,不適合復(fù)雜的錯(cuò)誤管理和異步錯(cuò)誤處理‌

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

  • performance.getEntries()方法:

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

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

看個(gè)例子

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

    var result = []; 
    // 獲取當(dā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è)最簡單的方法是數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript如何獲取父級(jí)元素和子級(jí)元素代碼示例

    JavaScript如何獲取父級(jí)元素和子級(jí)元素代碼示例

    最近工作中總遇到取各種父啊子啊,每次都得查,所以下面這篇文章主要給大家介紹了關(guān)于JavaScript如何獲取父級(jí)元素和子級(jí)元素的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • webpack 從指定入口文件中提取公共文件的方法

    webpack 從指定入口文件中提取公共文件的方法

    這篇文章主要介紹了webpack 從指定入口文件中提取公共文件的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • js change,propertychange,input事件小議

    js change,propertychange,input事件小議

    github上關(guān)于mootools一個(gè)issue的討論很有意思,所以就想測試記錄下。感興趣的可以點(diǎn)擊原頁面看看
    2011-12-12
  • JavaScript 新手24條實(shí)用建議[TUTS+]

    JavaScript 新手24條實(shí)用建議[TUTS+]

    本文列出了24條能讓你的代碼編寫過程更為輕松高效的建議。也許您還是JavaScript初學(xué)者,剛剛寫完自己的Hello World,那這里有很多對(duì)您的工作將十分有用的小貼士;也許有些技巧您已經(jīng)知道,那就試試快速瀏覽一下,看能不能發(fā)現(xiàn)一點(diǎn)新東西吧!
    2009-06-06
  • JavaScript設(shè)計(jì)模式之抽象工廠模式介紹

    JavaScript設(shè)計(jì)模式之抽象工廠模式介紹

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之抽象工廠模式介紹,抽象工廠模式就是對(duì)功能類單獨(dú)創(chuàng)建工廠類,這樣就不必修改之前的代碼,又?jǐn)U展了功能,需要的朋友可以參考下
    2014-12-12
  • JS多個(gè)異步請求 按順序執(zhí)行next實(shí)現(xiàn)解析

    JS多個(gè)異步請求 按順序執(zhí)行next實(shí)現(xiàn)解析

    這篇文章主要介紹了js多個(gè)異步請求 按順序執(zhí)行next實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JavaScript實(shí)現(xiàn)大數(shù)的運(yùn)算

    JavaScript實(shí)現(xiàn)大數(shù)的運(yùn)算

    js的'MAX_SAFE_INTEGER'是9007199254740991,而'MIN_SAFE_INTEGER'為-9007199254740991,那么如何實(shí)現(xiàn)一些特別大的數(shù)目相加?今天我們就來探討下
    2014-11-11
  • JavaScript常用8種數(shù)組去重代碼實(shí)例

    JavaScript常用8種數(shù)組去重代碼實(shí)例

    這篇文章主要介紹了JavaScript常用8種數(shù)組去重代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • ES6學(xué)習(xí)教程之Promise用法詳解

    ES6學(xué)習(xí)教程之Promise用法詳解

    這篇文章主要給大家介紹了關(guān)于ES6學(xué)習(xí)教程之Promise用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • JS實(shí)現(xiàn)含有中文字符串的友好截取功能分析

    JS實(shí)現(xiàn)含有中文字符串的友好截取功能分析

    這篇文章主要介紹了JS實(shí)現(xiàn)含有中文字符串的友好截取功能,結(jié)合實(shí)例形式分析了JS針對(duì)含有中文的字符串截取操作相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

诸城市| 沁源县| 荔波县| 淳安县| 万安县| 铜川市| 土默特右旗| 灵丘县| 嘉定区| 阿图什市| 金华市| 定南县| 察隅县| 苗栗市| 贡山| 阜平县| 定边县| 永川市| 芦溪县| 万山特区| 博客| 崇义县| 洛宁县| 木兰县| 海伦市| 阿巴嘎旗| 奎屯市| 玉屏| 慈溪市| 溧阳市| 炉霍县| 仲巴县| 潍坊市| 华阴市| 曲阳县| 清镇市| 武宣县| 淅川县| 太原市| 昌吉市| 图木舒克市|