摘要:這個(gè)時(shí)候就出場(chǎng)了,它定義為當(dāng)頁(yè)面文檔加載并解析完畢之后會(huì)馬上出發(fā)事件,而不會(huì)等待樣式文件圖片文件和子框架頁(yè)面的加載。
DOMContentLoaded 和 window.onload 的區(qū)別
當(dāng)頁(yè)面完全加載完畢后會(huì)觸發(fā) window.onload 事件,我們知道可以利用 window.onload 事件來(lái)觸發(fā)并執(zhí)行需要頁(yè)面完全加載完畢后才能執(zhí)行的 javascript 腳本,但是假如頁(yè)面包含很多樣式文件、圖片文件、子框架頁(yè)面(iframe)的話(huà),onload 事件也會(huì)被相應(yīng)延遲到這些文件加載完成才執(zhí)行,有時(shí)候并不是我們所需要的,例如我們想知道頁(yè)面從接受完畢到 dom 樹(shù)解析完成所需要的時(shí)間,那么 onload 事件則不適合了。
這個(gè)時(shí)候 DOMContentLoaded 就出場(chǎng)了,它定義為: 當(dāng)頁(yè)面文檔加載并解析完畢之后會(huì)馬上出發(fā) DOMContentLoaded 事件,而不會(huì)等待樣式文件、圖片文件和子框架頁(yè)面的加載。
示例 兼容性DOMContentLoaded 目前支持所有主流瀏覽器,IE9 之后也支持, 更多請(qǐng)看can I use?
如果要兼容 IE,則需要額外兩個(gè)事件,在 IE8 中,可以使用 readystatechange 事件來(lái)監(jiān)測(cè) DOM 文檔是否加載完畢,在更早的 IE 版本可以通過(guò)每隔一段時(shí)間用 try/catch 執(zhí)行一次 document.documentElement.doScroll("left") 來(lái)監(jiān)測(cè)這一狀態(tài), 因?yàn)檫@條代碼在 DOM 加載執(zhí)行完畢之前會(huì)拋出錯(cuò)誤(throw an error)
根據(jù)以上的解釋?zhuān)覀兛梢詫?xiě)一個(gè)兼容 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(); } }; }實(shí)驗(yàn)分割線(xiàn)
目前很多庫(kù)都實(shí)現(xiàn)了兼容性的頁(yè)面加載完成事件,大概思路是先判斷 document.readyState === "complete" 是否為真,如果為真則直接執(zhí)行腳本,否則才將腳本綁定到頁(yè)面加載完成的事件,然后根據(jù) document 是否有 addEventListener 來(lái)區(qū)分主流瀏覽器和 IE 瀏覽器,因?yàn)?IE9 及以后基本和主流瀏覽器一樣的標(biāo)準(zhǔn),所以主要用來(lái)區(qū)分 IE8 及以下,對(duì)于主流瀏覽器采用 DOMContentLoaded + window.load, 對(duì)于 IE8 及以下,采用 onreadystatechange + window.onload + doScroll。
這里要注意, onreadstatechange 事件并不可靠,如果頁(yè)面中存在圖片的時(shí)候,可能反而在 onload 事件之后才觸發(fā),正常來(lái)說(shuō),它只能正確地執(zhí)行頁(yè)面不包含二進(jìn)制資源或者非常少或者被緩存為時(shí)作為一個(gè)備選方案
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兼容實(shí)現(xiàn),為什么說(shuō)有了doScroll之后更接近DOMContentLoaded
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/50514.html
摘要:所以有可能在所有腳本執(zhí)行完畢后觸發(fā)。如果用戶(hù)即將離開(kāi)頁(yè)面或者關(guān)閉窗口時(shí),事件將會(huì)被觸發(fā)以進(jìn)行額外的確認(rèn)。狀態(tài)表示事件即將被觸發(fā)??偨Y(jié)頁(yè)面事件的生命周期事件在樹(shù)構(gòu)建完畢后被觸發(fā),我們可以在這個(gè)階段使用去訪問(wèn)元素。 頁(yè)面生命周期:DOMContentLoaded, load, beforeunload, unload 原文地址:http://javascript.info/onload.....
摘要:所以有可能在所有腳本執(zhí)行完畢后觸發(fā)。如果用戶(hù)即將離開(kāi)頁(yè)面或者關(guān)閉窗口時(shí),事件將會(huì)被觸發(fā)以進(jìn)行額外的確認(rèn)。狀態(tài)表示事件即將被觸發(fā)。總結(jié)頁(yè)面事件的生命周期事件在樹(shù)構(gòu)建完畢后被觸發(fā),我們可以在這個(gè)階段使用去訪問(wèn)元素。 頁(yè)面生命周期:DOMContentLoaded, load, beforeunload, unload 原文地址:http://javascript.info/onload.....
摘要:事件雖然不支持,但它支持事件,該事件的目的是提供與文檔或元素的加載狀態(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ì)...
摘要:事件雖然不支持,但它支持事件,該事件的目的是提供與文檔或元素的加載狀態(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ì)...
摘要:下面介紹非阻塞加載腳本技術(shù)也就是異步加載。非阻塞加載腳本關(guān)于的一篇好文目前所有瀏覽器都支持屬性,但是和中只有在加載外部腳本時(shí)才會(huì)生效,行內(nèi)腳本使用是沒(méi)有作用的。在中,只有外部腳本才會(huì)發(fā)生阻塞。 上篇博客說(shuō)過(guò)腳本后置可以使頁(yè)面更快的加載,可是這樣的優(yōu)化還是有限的,如果腳本需要執(zhí)行一個(gè)耗時(shí)的操作,就算后置了它還是會(huì)阻塞后續(xù)腳本加載和執(zhí)行并且阻塞整個(gè)頁(yè)面。下面介紹非阻塞加載腳本技術(shù)也就是...
摘要:簡(jiǎn)言理解頁(yè)面的生命周期,文檔加載事件及順序?qū)﹂_(kāi)發(fā)有十分的重要意義。同步的腳本最先執(zhí)行,它先于事件執(zhí)行。當(dāng)準(zhǔn)備就緒時(shí),事件在上觸發(fā)。表示文檔的當(dāng)前狀態(tài),可以在事件中跟蹤文檔狀態(tài)的變更。已經(jīng)解析完畢時(shí)觸發(fā),幾乎與同時(shí)發(fā)生,但在事件之前觸發(fā)。 簡(jiǎn)言 理解WEB頁(yè)面的生命周期,文檔加載事件及順序?qū)EB開(kāi)發(fā)有十分的重要意義。如果不理解,在元素未加載就提前操作元素,則得不到想要的結(jié)果。而如果頁(yè)面...
閱讀 892·2021-11-15 11:38
閱讀 1619·2021-09-24 09:48
閱讀 851·2021-09-24 09:47
閱讀 2281·2021-08-26 14:15
閱讀 3510·2019-08-30 11:09
閱讀 2616·2019-08-29 16:55
閱讀 1592·2019-08-26 14:01
閱讀 3047·2019-08-23 16:47