亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 開(kāi)發(fā) > CSS > 正文

深入解析動(dòng)態(tài)加載css的實(shí)現(xiàn)方法

2024-07-11 09:07:38
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、方法引用來(lái)源和應(yīng)用

此動(dòng)態(tài)加載css方法 loadCss,剝離自Sea.js,并做了進(jìn)一步的優(yōu)化(優(yōu)化代碼后續(xù)會(huì)進(jìn)行分析)。

因?yàn)楣卷?xiàng)目需要用到懶加載來(lái)提高網(wǎng)站加載速度,所以將非首屏渲染必需的css文件進(jìn)行動(dòng)態(tài)加載操作。

二、優(yōu)化后的完整代碼

/** @function 動(dòng)態(tài)加載css文件* @param {string} options.url -- css資源路徑* @param {function} options.callback -- 加載后回調(diào)函數(shù)* @param {string} options.id -- link標(biāo)簽id*/function loadCss(options){    var url = options.url,        callback = typeof options.callback == "function" ? options.callback : function(){},        id = options.id,        node = document.createElement("link"),        supportOnload = "onload" in node,        isOldWebKit = +navigator.userAgent.replace(/.*(?:AppleWebKit|AndroidWebKit)//?(/d+).*/i, "$1") < 536, // webkit舊內(nèi)核做特殊處理        protectNum = 300000; // 閾值10分鐘,一秒鐘執(zhí)行pollCss 500次    node.rel = "stylesheet";    node.type = "text/css";    node.href = url;    if( typeof id !== "undefined" ){        node.id = id;    }    document.getElementsByTagName("head")[0].appendChild(node);    // for Old WebKit and Old Firefox    if (isOldWebKit || !supportOnload) {        // Begin after node insertion        setTimeout(function() {            pollCss(node, callback, 0);        }, 1);        return;    }    if(supportOnload){        node.onload = onload;        node.onerror = function() {            // 加載失敗(404)            onload();        }    }else{        node.onreadystatechange = function() {            if (/loaded|complete/.test(node.readyState)) {                onload();            }        }    }    function onload() {        // 確保只跑一次下載操作        node.onload = node.onerror = node.onreadystatechange = null;        // 清空node引用,在低版本IE,不清除會(huì)造成內(nèi)存泄露        node = null;        callback();    }    // 循環(huán)判斷css是否已加載成功    /*    * @param node -- link節(jié)點(diǎn)    * @param callback -- 回調(diào)函數(shù)    * @param step -- 計(jì)步器,避免無(wú)限循環(huán)    */    function pollCss(node, callback, step){        var sheet = node.sheet,            isLoaded;        step += 1;        // 保護(hù),大于10分鐘,則不再輪詢(xún)        if(step > protectNum){            isLoaded = true;            // 清空node引用            node = null;            callback();            return;        }        if(isOldWebKit){            // for WebKit < 536            if(sheet){                isLoaded = true;            }        }else if(sheet){            // for Firefox < 9.0            try{                if(sheet.cssRules){                    isLoaded = true;                }            }catch(ex){                // 火狐特殊版本,通過(guò)特定值獲知是否下載成功                // The value of `ex.name` is changed from "NS_ERROR_DOM_SECURITY_ERR"                // to "SecurityError" since Firefox 13.0. But Firefox is less than 9.0                // in here, So it is ok to just rely on "NS_ERROR_DOM_SECURITY_ERR"                if(ex.name === "NS_ERROR_DOM_SECURITY_ERR"){                    isLoaded = true;                }            }        }        setTimeout(function() {            if(isLoaded){                // 延遲20ms是為了給下載的樣式留夠渲染的時(shí)間                callback();            }else{                pollCss(node, callback, step);            }        }, 20);    }}

三、解析代碼

一、參數(shù)

本方法支持三個(gè)參數(shù),可進(jìn)行擴(kuò)展。

1.1 opations.url

 url是需要引入的css資源路徑,也即標(biāo)簽的href屬性?xún)?nèi)容。

1.2 options.id

 id是標(biāo)簽的id屬性。這個(gè)參數(shù)為非必要參數(shù),可不傳。主要作用是標(biāo)記當(dāng)前標(biāo)簽,方便js進(jìn)行查找,以確定是否已加載某個(gè)css文件。

1.3 options.callback

 callback是css文件加載完成后會(huì)調(diào)用的回調(diào)函數(shù)。也存在特殊場(chǎng)景下,文件加載失敗,回調(diào)函數(shù)仍舊執(zhí)行的情況。

二、生成標(biāo)簽,并插入頭部head,進(jìn)行加載資源

var url = options.url,    callback = typeof options.callback == "function" ? options.callback : function(){},    id = options.id,    node = document.createElement("link");node.rel = "stylesheet";node.type = "text/css";node.href = url;if( typeof id !== "undefined" ){    node.id = id;}document.getElementsByTagName("head")[0].appendChild(node);

生成一個(gè)dom節(jié)點(diǎn),然后配置好rel、type、href等必需的屬性值,以便瀏覽器能正常解析鏈接的資源。

接著,查找到head節(jié)點(diǎn),將節(jié)點(diǎn)插入。

三、實(shí)現(xiàn)css資源下載狀態(tài)監(jiān)控的pollCss方法

 pollCss方法的職責(zé)是判斷插入的link節(jié)點(diǎn),也即node變量反饋資源是否已加載完成。

3.1 判斷的主要依據(jù)

瀏覽器加載css資源,會(huì)給該link節(jié)點(diǎn)生成sheet屬性,可以根據(jù)瀏覽器不同,讀取sheet屬性相關(guān)內(nèi)容,來(lái)判斷是否已經(jīng)加載完成。所以第一句語(yǔ)句var sheet = node.sheet首先要做的就是獲取sheet屬性值。

3.2 普通瀏覽器判斷

try{    if(sheet.cssRules){        isLoaded = true;    }}catch(ex){    // 火狐特殊版本,通過(guò)特定值獲知是否下載成功    // The value of `ex.name` is changed from "NS_ERROR_DOM_SECURITY_ERR"    // to "SecurityError" since Firefox 13.0. But Firefox is less than 9.0    // in here, So it is ok to just rely on "NS_ERROR_DOM_SECURITY_ERR"    if(ex.name === "NS_ERROR_DOM_SECURITY_ERR"){        isLoaded = true;    }}

如果讀取sheet.cssRules有值,證明css資源已經(jīng)鏈接進(jìn)頁(yè)面,并開(kāi)始解析。此時(shí)可以判斷資源加載成功。

如果讀取失敗,則根據(jù)拋錯(cuò)內(nèi)容,判斷是否有特定name屬性ex.name === "NS_ERROR_DOM_SECURITY_ERR"。存在,則代表是低版本火狐(9.0以前),且資源已經(jīng)加載成功。

3.3 舊webkit內(nèi)核瀏覽器判斷

var isOldWebKit = +navigator.userAgent.replace(/.*(?:AppleWebKit|AndroidWebKit)//?(/d+).*/i, "$1") < 536; // webkit舊內(nèi)核做特殊處理if(isOldWebKit){    // for WebKit < 536    if(sheet){        isLoaded = true;    }}

如果是webkit舊內(nèi)核瀏覽器,則只需要判斷sheet屬性值存在,則代表資源加載完成。

3.4 增加多次循環(huán)檢測(cè)

setTimeout(function() {    if(isLoaded){        // 延遲20ms是為了給下載的樣式留夠渲染的時(shí)間        callback();    }else{        pollCss(node, callback, step);    }}, 20);

觸發(fā)pollCss方法后,可能第一次檢測(cè)sheet值,會(huì)檢測(cè)不到。也就代表還沒(méi)加載完成。所以需要進(jìn)行輪詢(xún)。這里是隔20ms進(jìn)行一次問(wèn)詢(xún),直到資源加載完成為止。

3.5 輪詢(xún)?nèi)蒎e(cuò)(針對(duì)Sea.js源碼的優(yōu)化)

 css資源加載也有可能出錯(cuò)的時(shí)機(jī)存在,而且存在不觸發(fā)onerror方法的可能性。如果不加一個(gè)保護(hù),則輪詢(xún)可能一直持續(xù)下去,所以需要有一個(gè)極限閾值。

var protectNum = 300000, // 閾值10分鐘,一秒鐘執(zhí)行pollCss 500次    step = 0;// 很多代碼....step += 1;// 保護(hù),大于10分鐘,則不再輪詢(xún)if(step > protectNum){    isLoaded = true;    // 清空node引用    node = null;    callback();    return;}

這里的閾值是輪詢(xún)10分鐘,如果10分鐘后,仍然不符合條件,則默認(rèn)資源已下載完成,執(zhí)行callback方法,并清空node引用。

四、確定觸發(fā)pollCss檢查的時(shí)機(jī)

 4.1 pollCss輪詢(xún)的應(yīng)用場(chǎng)景

當(dāng)瀏覽器內(nèi)核是舊的webkit內(nèi)核時(shí),或者不支持節(jié)點(diǎn)觸發(fā)onload方法時(shí),才使用pollCss進(jìn)行輪詢(xún)。

// for Old WebKit and Old Firefoxif (isOldWebKit || !supportOnload) {    // Begin after node insertion    setTimeout(function() {        pollCss(node, callback, 0);    }, 1);    return;}

五、現(xiàn)代瀏覽器直接用onload和onreadystatechange做判斷

現(xiàn)代瀏覽器用這種方式判斷,可以避免輪詢(xún)的弊端。判斷也更加準(zhǔn)確及時(shí)。

 5.1 onload方法

function onload() {    // 確保只跑一次下載操作    node.onload = node.onerror = node.onreadystatechange = null;    // 清空node引用,在低版本IE,不清除會(huì)造成內(nèi)存泄露    node = null;    callback();}

 onload方法觸發(fā)執(zhí)行后,應(yīng)立即將多個(gè)相關(guān)方法進(jìn)行重置,以避免callback多次觸發(fā)。

 node = null;將node重置為null,是為了避免低版本的IE出現(xiàn)內(nèi)存溢出問(wèn)題,及時(shí)清除沒(méi)用的dom節(jié)點(diǎn)。

最后,執(zhí)行callback方法。

5.2 支持onload方法瀏覽器的處理

if(supportOnload){    node.onload = onload;    node.onerror = function() {        // 加載失敗(404)        onload();    }}

5.3 不支持onload方法瀏覽器的處理

if(supportOnload){    // 代碼...}else{    node.onreadystatechange = function() {        if (/loaded|complete/.test(node.readyState)) {            onload();        }    }}

四、后記

選擇剝離Sea.js方法進(jìn)行改造的原因:因?yàn)樵搄s庫(kù)使用人群很廣泛,如果出問(wèn)題,作者也會(huì)及時(shí)修復(fù)。所以,以此代碼為藍(lán)本進(jìn)行改造契合公司的用戶(hù)群,避免大面積出現(xiàn)問(wèn)題。

以上所述是小編給大家介紹的深入解析動(dòng)態(tài)加載css的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VeVb武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到CSS教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
黄色日韩网站视频| 踪合国产第二页| 欧美日韩尤物久久| 亚洲视频网站在线| 日本久久二区| 日本一区视频在线观看| 日韩在线三区| 男人添女荫道口女人有什么感觉| 福利视频在线看| 国产精品 欧美 日韩| 国产精品一区二区精品视频观看| 欧美色999| 亚洲视频免费观看| 一区二区三区高清在线| 免费人成年激情视频在线观看| 综合亚洲自拍| 亚洲欧洲国产精品一区| 欧美777四色影| 中文字幕在线久热精品| 久久亚洲免费| 久草在线视频网| 色老板在线观看| 日本一区二区视频在线播放| 色姑娘资源站| 亚洲免费三区一区二区| 精品国产依人香蕉在线精品| 日韩专区中文字幕一区二区| 波多野结衣喷潮| 中文在线最新版天堂| 99热自拍偷拍| 91精品综合久久久久久五月天| 全色精品综合影院| 欧美黄色激情| 日本wwwxx| 另类国产ts人妖高潮视频| 91麻豆国产语对白在线观看| 国产欧美一区二区色老头| 四季av一区二区| 亚洲国产精品成人一区二区在线| 亚洲免费一区二区| 欧美一级二级三级乱码| 久久精品国产久精国产| 中文字幕一区久| 欧美黄免费看| 台湾佬中文娱乐网欧美电影| 天天综合色天天综合色hd| 91在线国产观看| 少妇高潮久久77777| 1024手机在线视频| 成人自拍性视频| 日韩av高清在线观看| 在线观看免费观看在线| 成人拍拍拍免费视频网站| 秋霞av鲁丝片一区二区| 欧美尺度大的性做爰视频| 国内精品在线观看视频| 欧美第一在线视频| 97影院理论午夜| 日韩国产激情在线| 中文字幕第315页| 国产精品久久久网站| 38少妇精品导航| 日韩三级一区二区| 成年人免费大片| 妺妺窝人体色www在线小说| 欧美日韩精品二区第二页| 男人添女荫道口图片| 超碰在线97免费| 日韩电影一二三区| 99久久九九| 亚洲嫩模一区| 五月天一区二区三区| 美国一区二区| 亚洲无玛一区| 色婷婷av一区二区三区之红樱桃| 国产精品100| 色综合久久综合中文综合网| 麻豆av在线播放| 亚洲欧洲精品一区二区三区| 亚洲第一综合色| 久久成人久久爱| 久久mv成人精品亚洲动漫| 亚洲精品乱码久久久久久蜜桃麻豆| 超碰97国产精品人人cao| 粉嫩av一区二区三区免费野| 欧美体内she精视频在线观看| 亚洲在线播放电影| 亚洲精品一区二区口爆| 韩国版免费三体| 亚洲超碰在线| 欧美亚洲另类久久综合| 九九九免费视频| 成人直播大秀| 国产精品va在线观看无码| 永久在线免费观看| 欧美一级免费在线观看| 久久久91精品国产一区二区三区| 亚洲奶大毛多的老太婆| 欧美成人免费全部| www.成年人| 日本网站在线免费观看| 欧美系列精品| 不卡的免费av| 中文字幕av一区二区三区高| 中文字幕色网站| 久久久久久不卡| 午夜小视频在线| 亚洲国产精品精华液ab| 一区二区三区四区高清视频| 中文在线不卡| 国产免费视频在线| yiren22综合网成人| 97国产在线视频| 亚洲午夜精品久久久久久性色| 欧美国产精品久久| 欧美一区日韩一区| 久久国产精品一区| 一本久道中文无码字幕av| 最新在线中文字幕| 日韩精品一区二区三区四| 亚洲va韩国va欧美va| 黄色一级片在线免费观看| 一区国产精品视频| 制服丝袜第一页在线观看| xxxx视频在线| 免费黄视频网站| 国产成人免费av在线| 久久久国产精品入口麻豆| 亚洲狼人综合| 日韩黄色中文字幕| 岛国一区二区三区| xxxx在线播放| 欧美特黄级在线| 精品久久久中文| 国产精品盗摄一区二区三区| 久久久午夜精品理论片中文字幕| 欧美精品导航| 两女双腿交缠激烈磨豆腐| 日韩三级一区二区| 美女av一区二区三区| 牛牛国产精品| 国产人成精品一区二区三| 一级黄色片免费看| 免费av在线一区| caoporn97免费视频公开| 久久av中文字幕| 女人18毛片毛片毛片毛片区二| 免费av不卡在线| 国产成人av一区二区三区| 视频免费1区二区三区| 国产精品扒开腿做爽爽爽视频软件| 成品人视频ww入口| 国产1区2区3区精品美女| 青青草国产精品97视觉盛宴| 国产精华一区| 亚洲视频观看| 欧美一区二区三区四区在线观看地址| 精品制服美女久久| 日本高清在线观看wwwww色| 久久国产精品高清一区二区三区| 久久精品免视着国产成人| 蜜桃久久久久| 山东少妇露脸刺激对白在线| 手机看片久久| 日本1区2区3区中文字幕| 亚洲天堂一二三| 精品成人影院| 中文字幕免费在线看线人动作大片| 亚洲精品乱码日韩| 一区视频在线看| 日韩成人18| 性感美女极品91精品| 国产精品久久视频| 欧美va亚洲va国产综合| 日本欧美在线视频| 麻豆久久久久久| 亚洲免费观看高清完整版在线观看| 久久中文字幕电影| 欧美视频1区| 国产www视频| 亚洲国产精品一区二区www| 婷婷成人激情在线网| 亚洲调教视频在线观看| 亚洲高清资源在线观看| 免费在线观看视频一区| 国产私拍福利精品视频二区| 日韩精品免费在线| 97超碰在线播放| 久久久99精品视频| 中文字幕人妻熟女人妻a片| 怡红院在线观看| 国产91在线高潮白浆在线观看| 亚洲v在线观看| 一区精品在线| 国产精品美女主播在线观看纯欲| 日韩精品无码一区二区三区| 亲爱的老师6电影韩剧| 国产草草影院ccyycom| 欧美成人全部免费| 日韩免费看网站| 人妻妺妺窝人体色www聚色窝| 欧美日韩国产一级| 男人靠女人免费视频网站| 中文字幕一区2区3区| 中文字幕一区二区三区色视频| 日日摸夜夜添夜夜添精品视频| 久色乳综合思思在线视频| 亚洲人亚洲人色久| 美女性感视频久久| 69视频在线播放| 三上悠亚影音先锋| 神马午夜电影一区二区三区在线观看| 亚洲欧美激情网| 亚洲人成无码网站久久99热国产| 免费毛片在线播放| 六月婷婷激情综合| 欧美最顶级丰满的aⅴ艳星| 日韩av一卡二卡| 日本强好片久久久久久aaa| 欧美精品一区二区三区蜜桃视频| 午夜精品福利一区二区| 少妇视频在线| 国产又大又粗又长| 久草香蕉在线| 成人妇女淫片aaaa视频| 亚洲激情另类| 一区二区精品国产| 美女做暖暖视频免费在线观看全部网址91| 久久久久99精品成人| 久久精品视频在线观看榴莲视频| 妞干网在线视频观看| 精品捆绑调教一区二区三区| 911亚洲精选| 99精品欧美一区二区| 伊人www22综合色| 亚洲成年人在线播放| 69视频在线| 日韩欧美国产综合在线一区二区三区| 亚洲欧美日韩小说| 日韩西西人体444www| 欧美日韩一区二区三区视视频| 一级黄色录像视频| av电影在线观看网址| 国产色视频在线播放| 亚洲无人区码一码二码三码的含义| 欧美日韩亚洲在线| 合欧美一区二区三区| 九色蝌蚪在线观看| 天天躁日日躁成人字幕aⅴ| 成人a在线观看高清电影| 国产一级黄色电影| 你懂的视频在线看| 国产伦精品一区二区三区在线| av资源种子在线观看| 欧美wwwxxxx| 伊人网站在线| 深夜成人在线观看| 欧美精品乱码久久久久久按摩| 99青草视频在线播放视| 日韩欧美在线免费观看视频| 亚洲精品在线a| 在线观看精品自拍私拍| 2019天天干夜夜操| 动漫性做爰视频| 黄色大片在线免费看| 久久久久久久久久久影视| 特黄毛片在线观看| 第四色日韩影片| 亚洲精选一区二区三区| 男人晚上看的视频| 国产精品视频中文字幕| 波多野吉衣中文字幕| 国产毛片毛片毛片毛片毛片毛片| 国产一卡2卡3卡四卡网站| 免费萌白酱国产一区二区三区| 欧美aaa级片| 欧美日韩精品三区| 欧美日本在线播放| 亚洲美女免费精品视频在线观看| 国产精品99免费看| 一区二区91美女张开腿让人桶| 亚洲一线在线观看| 亚洲区精品久久一区二区三区| 日韩av最新在线观看| 午夜精品在线观看| av午夜精品一区二区三区| 欧美精品 日韩| 久热中文字幕在线精品首页| 日韩一级精品| 强开小嫩苞一区二区三区网站| 顶级嫩模一区二区三区| 欧美韩国日本精品一区二区三区| 天天爽夜夜爽夜夜爽精品视频| 首页综合国产亚洲丝袜| 国产在线播精品第三| 欧美日韩精品综合| 5566中文字幕| 日韩欧美a级成人黄色| 天堂av一区二区三区| 精品国产免费一区二区三区四区| 久久影音资源网| 91精品国产综合久久久久久久| 亚洲高清不卡在线观看| 精品人妻无码一区二区三区换脸| 国产一区二区三区黄片| 免费福利在线视频| 亚洲欧美一区二区三区四区五区| 欧美大片专区| 欧美理伦片在线播放| 一个人看免费www视频有多爽| 国产精品久久久999| 爱情岛论坛亚洲入口| 一区二区三区四区在线播放| 午夜激情视频在线观看| 窝窝社区一区二区| 国产一区二区视频在线观看| 制服丝袜亚洲精品中文字幕| 中文在线资源天堂| 欧美激情在线播放| 国产精品综合网站| 欧美成人精品欧美一级| 日本不卡不码高清免费观看| 亚洲久久中文字幕| 国产香蕉精品视频一区二区三区| 尤物视频免费| 亚洲国产激情av| 三日本三级少妇三级99| 日本sm残虐另类|