成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺談DOMContentLoaded事件及其封裝方法

waruqi / 2571人閱讀

摘要:事件雖然不支持,但它支持事件,該事件的目的是提供與文檔或元素的加載狀態(tài)有關(guān)的信息。事件可以用于檢測(cè)是否加載完畢,當(dāng)時(shí),表示加載完成。封裝事件以下,是封裝事件從而達(dá)到良好的兼容性的一個(gè)簡(jiǎn)單的代碼實(shí)現(xiàn)。

我們?cè)陂_(kāi)發(fā)時(shí),經(jīng)常需要檢測(cè)頁(yè)面是否加載完畢,以確保腳本安全運(yùn)行,下面我們就來(lái)淺談一下檢測(cè)頁(yè)面是否加載完畢的那些事件們。

1. onload 事件

在頁(yè)面的所有資源加載完成時(shí),window對(duì)象上會(huì)觸發(fā)一個(gè)onload事件。該事件通常被用以執(zhí)行一些邏輯代碼。比如,你需要通過(guò)JS去訪問(wèn)一個(gè)DOM。


chengxuyuan

上述代碼運(yùn)行時(shí)肯定會(huì)報(bào)錯(cuò),因?yàn)槟_本執(zhí)行時(shí),id為name的div還沒(méi)有加載完成。那么什么時(shí)機(jī)才是我們獲取DOM文檔的可靠時(shí)機(jī)呢?正是我們上面說(shuō)道的onload,頁(yè)面的onload觸發(fā)時(shí),證明頁(yè)面文檔流及資源已經(jīng)完全加載完畢,此時(shí),獲取在文檔流中的DOM是最“安全”的時(shí)機(jī)。我們將上述代碼加以改造,如下:


chengxuyuan

再次運(yùn)行時(shí),代碼便不會(huì)報(bào)錯(cuò)了。因此,onload事件的實(shí)際效果是當(dāng)頁(yè)面解析完DOM樹(shù),并且完成了所有圖片、樣式表、腳本等資源的加載后才被觸發(fā)。那么問(wèn)題來(lái)了,當(dāng)資源過(guò)多過(guò)大時(shí),onload會(huì)出現(xiàn)比較嚴(yán)重的延遲問(wèn)題,嚴(yán)重影響用戶體驗(yàn)。

2. DOMContentLoaded 事件

對(duì)比上述情況,F(xiàn)irefox的DOMContentLoaded事件就更加合理,該方法觸發(fā)的時(shí)間更早,它在DOM內(nèi)容加載完后就觸發(fā),無(wú)需等待其他資源的加載完成。

上述代碼的執(zhí)行結(jié)果為依次打印出:

DOM已被完全加載和解析
頁(yè)面資源全部加載完畢

由此可見(jiàn),DOMContentLoaded事件能更早地捕獲到DOM加載完成。

目前,Webkit 525以上版本和Opera也包含該方法。此外,它目前已在HTML5中被標(biāo)準(zhǔn)化。但I(xiàn)E仍不支持DOMContentLoaded。

另外,很多JavaScript框架都有document.ready功能,例如jQuery的:

$(document).ready(function(){});

它的核心就是DOMContentLoaded事件,可以使用:

document.addEventListener("DOMContentLoaded",function(){...},false);

進(jìn)行事件綁定,但還是需要針對(duì)IE做兼容性處理。

3. onreadystatechange 事件

雖然IE不支持DOMContentLoaded,但它支持onreadystatechange事件,該事件的目的是提供與文檔或元素的加載狀態(tài)有關(guān)的信息。支持onreadystatechange事件的每個(gè)對(duì)象都有一個(gè)readyState屬性,可能包含下列5個(gè)值中的一個(gè)。

uninitialized(為初始化):對(duì)象存在但尚未初始化。

loading(正在加載):對(duì)象正在加載數(shù)據(jù)。

loaded(加載完畢):對(duì)象加載數(shù)據(jù)完成。

interactive(交互):可以操作對(duì)象了,但還沒(méi)有完全加載。

complete(完成):對(duì)象已經(jīng)加載完畢。

onreadystatechange事件可以用于檢測(cè)DOM是否加載完畢,當(dāng)document.readyState == "complete"時(shí),表示DOM加載完成。但是如果頁(yè)面中有iframe的話,會(huì)等到iframe中的所有資源加載完才會(huì)變成complete。 此時(shí)也造成了主頁(yè)面的延遲。并且,經(jīng)測(cè)試,即使頁(yè)面中沒(méi)有iframe, 該方式也與onload相當(dāng),依然會(huì)等到所有資源下載完畢后才觸發(fā)。

4. doScroll方法

不過(guò),IE還有個(gè)特有的方法doScroll, 通過(guò)間隔調(diào)用:

document.documentElement.doScroll("left");

可以檢測(cè)DOM是否加載完成。 當(dāng)頁(yè)面未加載完成時(shí),該方法會(huì)報(bào)錯(cuò),直到doScroll不再報(bào)錯(cuò)時(shí),就代表DOM加載完成了。該方法更接近DOMContentLoaded的實(shí)現(xiàn)。

5. Javascript封裝DOMContentLoaded事件

以下,是JS封裝DOMContentLoaded事件從而達(dá)到良好的兼容性的一個(gè)簡(jiǎn)單的代碼實(shí)現(xiàn)。

function ready(fn){

    // 目前Mozilla、Opera和webkit 525+內(nèi)核支持DOMContentLoaded事件
    if(document.addEventListener) {
        document.addEventListener("DOMContentLoaded", function() {
            document.removeEventListener("DOMContentLoaded",arguments.callee, false);
            fn();
        }, false);
    } 

    // 如果IE
    else if(document.attachEvent) {
        // 確保當(dāng)頁(yè)面是在iframe中加載時(shí),事件依舊會(huì)被安全觸發(fā)
        document.attachEvent("onreadystatechange", function() {
            if(document.readyState == "complete") {
                document.detachEvent("onreadystatechange", arguments.callee);
                fn();
            }
        });

        // 如果是IE且頁(yè)面不在iframe中時(shí),輪詢調(diào)用doScroll 方法檢測(cè)DOM是否加載完畢
        if(document.documentElement.doScroll && typeof window.frameElement === "undefined") {
            try{
                document.documentElement.doScroll("left");
            }
            catch(error){
                return setTimeout(arguments.callee, 20);
            };
            fn();
        }
    }
};

對(duì)于IE,首先注冊(cè)documentonreadystatechange事件,這是為了避免當(dāng)頁(yè)面處于iframe中時(shí),doScroll方法會(huì)失效,因此在實(shí)現(xiàn)代碼中做了判斷。之后,判斷如果是IE并且頁(yè)面不在iframe當(dāng)中, 則通過(guò)setTimeout來(lái)不斷的調(diào)用:

document.documentElement.doScroll("left");

直到調(diào)用成功,代表DOM加載完成。

總結(jié)一下,開(kāi)發(fā)時(shí)我們可以通過(guò)封裝DOMContentLoaded事件來(lái)檢測(cè)頁(yè)面DOM是否加載完畢,然后執(zhí)行邏輯代碼,提升用戶體驗(yàn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79882.html

相關(guān)文章

  • 淺談DOMContentLoaded事件及其封裝方法

    摘要:事件雖然不支持,但它支持事件,該事件的目的是提供與文檔或元素的加載狀態(tài)有關(guān)的信息。事件可以用于檢測(cè)是否加載完畢,當(dāng)時(shí),表示加載完成。封裝事件以下,是封裝事件從而達(dá)到良好的兼容性的一個(gè)簡(jiǎn)單的代碼實(shí)現(xiàn)。 我們?cè)陂_(kāi)發(fā)時(shí),經(jīng)常需要檢測(cè)頁(yè)面是否加載完畢,以確保腳本安全運(yùn)行,下面我們就來(lái)淺談一下檢測(cè)頁(yè)面是否加載完畢的那些事件們。 1. onload 事件 在頁(yè)面的所有資源加載完成時(shí),window對(duì)...

    leon 評(píng)論0 收藏0
  • 2018 淺談前端面試那些事

    摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒(méi)有換工作的打算 但為了跟上時(shí)代的腳步 還是忍不住整理了一份最新前端知識(shí)點(diǎn) 知識(shí)點(diǎn)匯總 1.HTML HTML5新特性,語(yǔ)義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫(xiě)法css js放置位置和原因...

    LiuRhoRamen 評(píng)論0 收藏0
  • 2018 淺談前端面試那些事

    摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒(méi)有換工作的打算 但為了跟上時(shí)代的腳步 還是忍不住整理了一份最新前端知識(shí)點(diǎn) 知識(shí)點(diǎn)匯總 1.HTML HTML5新特性,語(yǔ)義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫(xiě)法css js放置位置和原因...

    stormgens 評(píng)論0 收藏0
  • 2018 淺談前端面試那些事

    摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒(méi)有換工作的打算 但為了跟上時(shí)代的腳步 還是忍不住整理了一份最新前端知識(shí)點(diǎn) 知識(shí)點(diǎn)匯總 1.HTML HTML5新特性,語(yǔ)義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫(xiě)法css js放置位置和原因...

    Hujiawei 評(píng)論0 收藏0
  • 淺談網(wǎng)頁(yè)基本性能優(yōu)化規(guī)則小結(jié)

    摘要:雪碧圖內(nèi)聯(lián)圖片將站內(nèi)小圖標(biāo)合并成一張圖,使用定位截取對(duì)應(yīng)圖標(biāo)適當(dāng)使用內(nèi)聯(lián)圖片。瀏覽器緩存合理設(shè)置瀏覽器緩存是網(wǎng)頁(yè)優(yōu)化的重要手段之一。為什么要減少請(qǐng)求在性能優(yōu)化中減少請(qǐng)求的措施占了很大部分,比如使用雪碧 這篇文章主要介紹了淺談網(wǎng)頁(yè)基本性能優(yōu)化規(guī)則小結(jié)的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧 針對(duì)瀏覽器網(wǎng)頁(yè)的一些優(yōu)化規(guī)則 頁(yè)面優(yōu)化 靜態(tài)資源壓縮...

    Aomine 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<