摘要:這個時候就出場了,它定義為當(dāng)頁面文檔加載并解析完畢之后會馬上出發(fā)事件,而不會等待樣式文件圖片文件和子框架頁面的加載。
DOMContentLoaded 和 window.onload 的區(qū)別
當(dāng)頁面完全加載完畢后會觸發(fā) window.onload 事件,我們知道可以利用 window.onload 事件來觸發(fā)并執(zhí)行需要頁面完全加載完畢后才能執(zhí)行的 javascript 腳本,但是假如頁面包含很多樣式文件、圖片文件、子框架頁面(iframe)的話,onload 事件也會被相應(yīng)延遲到這些文件加載完成才執(zhí)行,有時候并不是我們所需要的,例如我們想知道頁面從接受完畢到 dom 樹解析完成所需要的時間,那么 onload 事件則不適合了。
這個時候 DOMContentLoaded 就出場了,它定義為: 當(dāng)頁面文檔加載并解析完畢之后會馬上出發(fā) DOMContentLoaded 事件,而不會等待樣式文件、圖片文件和子框架頁面的加載。
示例 兼容性DOMContentLoaded 目前支持所有主流瀏覽器,IE9 之后也支持, 更多請看can I use?
如果要兼容 IE,則需要額外兩個事件,在 IE8 中,可以使用 readystatechange 事件來監(jiān)測 DOM 文檔是否加載完畢,在更早的 IE 版本可以通過每隔一段時間用 try/catch 執(zhí)行一次 document.documentElement.doScroll("left") 來監(jiān)測這一狀態(tài), 因為這條代碼在 DOM 加載執(zhí)行完畢之前會拋出錯誤(throw an error)
根據(jù)以上的解釋,我們可以寫一個兼容 IE 的 DOMContentLoaded 事件from
// if IE function IEContentLoaded (w, fn) { var d = w.document, done = false, // only fire once init = function () { if (!done) { done = true; fn(); } }; // polling for no errors (function () { try { // throws errors until after ondocumentready d.documentElement.doScroll("left"); } catch (e) { setTimeout(arguments.callee, 50); return; } // no errors, fire init(); })(); // trying to always fire before onload d.onreadystatechange = function() { if (d.readyState == "complete") { d.onreadystatechange = null; init(); } }; }實驗分割線
目前很多庫都實現(xiàn)了兼容性的頁面加載完成事件,大概思路是先判斷 document.readyState === "complete" 是否為真,如果為真則直接執(zhí)行腳本,否則才將腳本綁定到頁面加載完成的事件,然后根據(jù) document 是否有 addEventListener 來區(qū)分主流瀏覽器和 IE 瀏覽器,因為 IE9 及以后基本和主流瀏覽器一樣的標(biāo)準(zhǔn),所以主要用來區(qū)分 IE8 及以下,對于主流瀏覽器采用 DOMContentLoaded + window.load, 對于 IE8 及以下,采用 onreadystatechange + window.onload + doScroll。
這里要注意, onreadstatechange 事件并不可靠,如果頁面中存在圖片的時候,可能反而在 onload 事件之后才觸發(fā),正常來說,它只能正確地執(zhí)行頁面不包含二進(jìn)制資源或者非常少或者被緩存為時作為一個備選方案
function domReady(fn) { var ready = false, top = false, doc = window.document, root = doc.documentElement, modern = doc.addEventListener, add = modern ? "addEventListener" : "attachEvent", del = modern ? "removeEventListener" : "detachEvent", pre = modern ? "" : "on", init = function(e) { if (e.type === "readystatechange" && doc.readyState !== "complete") return; (e.type === "load" ? window : doc)[del](pre + e.type, init, false); if (!ready && (ready = true)) fn.call(window, e.type || e); }, poll = function() { try { root.doScroll("left"); } catch(e) { setTimeout(pull, 50); return; } init("poll"); }; if (doc.readyState === "complete") fn.call(window, "lazy"); else { if (!modern && root.doScroll) { try { top = !window.frameElement; } catch(e) {} if (top) poll(); } doc[add](pre + "DOMContentLoaded", init, false); doc[add](pre + "readystatechange", init, false); window[add](pre + "load", init, false); } }相關(guān)事件
readystatechange
load
beforeunload
unload
拓展jquery ready 分析
ContentedLoaded
關(guān)于DOMReady的IE兼容實現(xiàn),為什么說有了doScroll之后更接近DOMContentLoaded
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/81927.html
摘要:所以有可能在所有腳本執(zhí)行完畢后觸發(fā)。如果用戶即將離開頁面或者關(guān)閉窗口時,事件將會被觸發(fā)以進(jìn)行額外的確認(rèn)。狀態(tài)表示事件即將被觸發(fā)。總結(jié)頁面事件的生命周期事件在樹構(gòu)建完畢后被觸發(fā),我們可以在這個階段使用去訪問元素。 頁面生命周期:DOMContentLoaded, load, beforeunload, unload 原文地址:http://javascript.info/onload.....
摘要:所以有可能在所有腳本執(zhí)行完畢后觸發(fā)。如果用戶即將離開頁面或者關(guān)閉窗口時,事件將會被觸發(fā)以進(jìn)行額外的確認(rèn)。狀態(tài)表示事件即將被觸發(fā)。總結(jié)頁面事件的生命周期事件在樹構(gòu)建完畢后被觸發(fā),我們可以在這個階段使用去訪問元素。 頁面生命周期:DOMContentLoaded, load, beforeunload, unload 原文地址:http://javascript.info/onload.....
摘要:事件雖然不支持,但它支持事件,該事件的目的是提供與文檔或元素的加載狀態(tài)有關(guān)的信息。事件可以用于檢測是否加載完畢,當(dāng)時,表示加載完成。封裝事件以下,是封裝事件從而達(dá)到良好的兼容性的一個簡單的代碼實現(xiàn)。 我們在開發(fā)時,經(jīng)常需要檢測頁面是否加載完畢,以確保腳本安全運(yùn)行,下面我們就來淺談一下檢測頁面是否加載完畢的那些事件們。 1. onload 事件 在頁面的所有資源加載完成時,window對...
摘要:事件雖然不支持,但它支持事件,該事件的目的是提供與文檔或元素的加載狀態(tài)有關(guān)的信息。事件可以用于檢測是否加載完畢,當(dāng)時,表示加載完成。封裝事件以下,是封裝事件從而達(dá)到良好的兼容性的一個簡單的代碼實現(xiàn)。 我們在開發(fā)時,經(jīng)常需要檢測頁面是否加載完畢,以確保腳本安全運(yùn)行,下面我們就來淺談一下檢測頁面是否加載完畢的那些事件們。 1. onload 事件 在頁面的所有資源加載完成時,window對...
摘要:下面介紹非阻塞加載腳本技術(shù)也就是異步加載。非阻塞加載腳本關(guān)于的一篇好文目前所有瀏覽器都支持屬性,但是和中只有在加載外部腳本時才會生效,行內(nèi)腳本使用是沒有作用的。在中,只有外部腳本才會發(fā)生阻塞。 上篇博客說過腳本后置可以使頁面更快的加載,可是這樣的優(yōu)化還是有限的,如果腳本需要執(zhí)行一個耗時的操作,就算后置了它還是會阻塞后續(xù)腳本加載和執(zhí)行并且阻塞整個頁面。下面介紹非阻塞加載腳本技術(shù)也就是...
摘要:簡言理解頁面的生命周期,文檔加載事件及順序?qū)﹂_發(fā)有十分的重要意義。同步的腳本最先執(zhí)行,它先于事件執(zhí)行。當(dāng)準(zhǔn)備就緒時,事件在上觸發(fā)。表示文檔的當(dāng)前狀態(tài),可以在事件中跟蹤文檔狀態(tài)的變更。已經(jīng)解析完畢時觸發(fā),幾乎與同時發(fā)生,但在事件之前觸發(fā)。 簡言 理解WEB頁面的生命周期,文檔加載事件及順序?qū)EB開發(fā)有十分的重要意義。如果不理解,在元素未加載就提前操作元素,則得不到想要的結(jié)果。而如果頁面...
閱讀 3226·2021-10-13 09:40
閱讀 3688·2019-08-30 15:54
閱讀 1309·2019-08-30 13:20
閱讀 2993·2019-08-30 11:26
閱讀 475·2019-08-29 11:33
閱讀 1099·2019-08-26 14:00
閱讀 2356·2019-08-26 13:58
閱讀 3366·2019-08-26 10:39