摘要:事件詳細(xì)研究邊界事件外鏈樣式在某些瀏覽器下面會(huì)影響腳本的加載。事件和事件是同時(shí)的。這就是要監(jiān)聽頁(yè)面的事件,當(dāng)事件為時(shí)就可以開始做的事情了。
頁(yè)面加載狀態(tài)
$(document).ready() $(function(){})
這兩個(gè)是我們?cè)陧?yè)面初始化時(shí)經(jīng)常使用的監(jiān)聽方案,那么他的實(shí)際的執(zhí)行關(guān)系時(shí)什么樣的呢?在原生js中是什么樣的一種表現(xiàn)?
以下我會(huì)一而再再而三的寫DOMContentLoaded,因?yàn)楹枚嗤瑢W(xué)都沒有怎么聽說過這個(gè)事件
onload vs DOMContentLoaded
定義
onload:
當(dāng)onload事件觸發(fā)的時(shí)候,頁(yè)面上的所有dom,樣式表,腳本,圖片,flash都已經(jīng)加載完成了
DOMContentLoaded:
當(dāng)DOMContentLoaded事件觸發(fā)時(shí),僅當(dāng)dom加載完成,不包括樣式表,圖片,flash
光看定義,一目了然,哪個(gè)比較適合作為我們判斷的標(biāo)準(zhǔn):圖片啊什么的,我們完全可以不用等。
DOMContentLoaded事件詳細(xì)研究DOMContentLoaded邊界事件
外鏈樣式在某些瀏覽器下面會(huì)影響腳本的加載。
在某些Gecko和Webkit引擎版本的瀏覽器里面,&&IE8在內(nèi),會(huì)同時(shí)發(fā)起多個(gè)http的請(qǐng)求并行加載樣式表和腳步,但是腳本會(huì)等樣式表加載完成之后才會(huì)被執(zhí)行,甚至樣式表加載之前頁(yè)面都不會(huì)渲染。opera不會(huì),樣式表未加載好就可以執(zhí)行js。
DOMContentLoaded兼容性DOMContentLoaded事件兼容處理方案
由上可知,DOMContentLoaded事件在ie9以下是不支持的,那么慣例,我們要開始搞兼容處理方案
ie8及以下兼容處理方案
ie的一般處理方案
html加載過程中會(huì)有一個(gè)document.readyState狀態(tài)
五種狀態(tài):
0(未初始化):還沒有send
1 loading(載入):正在發(fā)送請(qǐng)求
2 loaded(載入完成):執(zhí)行完成,已經(jīng)接收到全部響應(yīng)內(nèi)容
3 interactive(交互): 正在解析響應(yīng)內(nèi)容
4 complete(完成): 響應(yīng)內(nèi)容解析完成,客戶端可以用了。
complete事件和window.onload事件是同時(shí)的。
這就是要監(jiān)聽頁(yè)面的readystatechange事件,當(dāng)事件為interactive||complete時(shí)就可以開始做js的事情了。
帶iframe的處理
但是當(dāng)頁(yè)面中帶有iframe時(shí),這個(gè)readyState狀態(tài)會(huì)掛起一直等待,等待頁(yè)面的iframe也加載完畢之后再處理,這個(gè)過程是我們不想要得,那就有另外一種處理方案
(function doScrollCheck(){ try{ temp.doScroll("left"); result += "ie scroll" + (new Date()).getTime()+" "; } catch(e){ return setTimeout(doScrollCheck, 50); } }());
doScroll事件在頁(yè)面加載完成之前是不能調(diào)用的,調(diào)用就失敗了,可以用try catch的方法來完成
jQuery處理方案
基本上說清楚了,那么我們來看看jQuery是怎么搞的吧
jQuery.ready.promise = function( obj ) { if ( !readyList ) { readyList = jQuery.Deferred(); //如果執(zhí)行到此處時(shí),document.readyState已經(jīng)是complete,就可以是ready了 if ( document.readyState === "complete" ) { setTimeout( jQuery.ready ); //標(biāo)準(zhǔn)處理方案,DOMContentLoaded,一般瀏覽器都有的。 } else if ( document.addEventListener ) { //事件監(jiān)聽 document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // 做個(gè)備份,不管怎么樣,load事件時(shí)一定一定會(huì)執(zhí)行的 window.addEventListener( "load", jQuery.ready, false ); // ie處理方案 } else { //這個(gè)時(shí)間比doscroll事件快好多,他會(huì)在交互狀態(tài)就觸發(fā),見demo2 document.attachEvent( "onreadystatechange", DOMContentLoaded ); // 還是備份 window.attachEvent( "onload", jQuery.ready ); // 且沒有iframe的方案 var top = false; try { top = window.frameElement == null && document.documentElement; } catch(e) {} if ( top && top.doScroll ) { (function doScrollCheck() { if ( !jQuery.isReady ) { try { top.doScroll("left"); } catch(e) { return setTimeout( doScrollCheck, 50 ); } jQuery.ready(); } })(); } } } return readyList.promise( obj ); };
這就是我們常用的ready事件
敬請(qǐng)期待下期,defer sync 各種各種和loaded DOMContentLoaded事件的關(guān)系
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91652.html
摘要:事件詳細(xì)研究邊界事件外鏈樣式在某些瀏覽器下面會(huì)影響腳本的加載。事件和事件是同時(shí)的。這就是要監(jiān)聽頁(yè)面的事件,當(dāng)事件為時(shí)就可以開始做的事情了。 頁(yè)面加載狀態(tài) $(document).ready() $(function(){}) 這兩個(gè)是我們?cè)陧?yè)面初始化時(shí)經(jīng)常使用的監(jiān)聽方案,那么他的實(shí)際的執(zhí)行關(guān)系時(shí)什么樣的呢?在原生js中是什么樣的一種表現(xiàn)? 以下我會(huì)一而再再而三的寫DOMConten...
摘要:由于那個(gè)時(shí)候是霸主,這也導(dǎo)致微軟推出的時(shí)候必須把自己偽裝成瀏覽器,于是他們的也是以開頭的。各個(gè)版本典型的如下其中之后的就是當(dāng)前的版本號(hào)。的幾個(gè)版本的其中之后的是版本號(hào)提供了專門的瀏覽器標(biāo)志,就是屬性。目前,的是其中,版本號(hào)在之后的數(shù)字。 瀏覽器嗅探 瀏覽器嗅探不用說了,為了更好的性能,會(huì)需要各種各樣的兼容性處理,自然就會(huì)有針對(duì)不同瀏覽器的判斷.一般的代碼中,我們都是通過navigato...
摘要:拋開一直寫的那個(gè)不講,我們說的是一個(gè)簡(jiǎn)單的模塊加載器的簡(jiǎn)單實(shí)現(xiàn)。非常好實(shí)現(xiàn),忽略不提。是第一個(gè)冒出來的,但是,一般提到他都會(huì)是棄用的,會(huì)有安全的漏洞更好的方案是構(gòu)造器。 什么是模塊化,為什么要模塊化 裝個(gè)b,貼一段English A beginning programmer writes her programs like an ant builds her hill, one pie...
摘要:希望幫助更多的前端愛好者學(xué)習(xí)。前端開發(fā)者指南作者科迪林黎,由前端大師傾情贊助。翻譯最佳實(shí)踐譯者張捷滬江前端開發(fā)工程師當(dāng)你問起有關(guān)與時(shí),老司機(jī)們首先就會(huì)告訴你其實(shí)是個(gè)沒有網(wǎng)絡(luò)請(qǐng)求功能的庫(kù)。 前端基礎(chǔ)面試題(JS部分) 前端基礎(chǔ)面試題(JS部分) 學(xué)習(xí) React.js 比你想象的要簡(jiǎn)單 原文地址:Learning React.js is easier than you think 原文作...
摘要:本文是一篇簡(jiǎn)單的構(gòu)建三維視圖的入門教程,你可以了解到利用創(chuàng)建簡(jiǎn)單的三維圖形,并且控制圖形運(yùn)動(dòng)。然后將其加入到中。三創(chuàng)建對(duì)象大多數(shù)時(shí)候,我們需要講繪制的圖形整合到一起進(jìn)行控制。在軸上運(yùn)動(dòng)的完整代碼這個(gè)入門教程就到這里了,感謝閱讀。 本文是一篇簡(jiǎn)單的webGL+threejs構(gòu)建web三維視圖的入門教程,你可以了解到利用threejs創(chuàng)建簡(jiǎn)單的三維圖形,并且控制圖形運(yùn)動(dòng)。若有不足,歡迎指出...
閱讀 1157·2021-11-25 09:43
閱讀 1677·2021-09-13 10:25
閱讀 2638·2021-09-09 11:38
閱讀 3447·2021-09-07 10:14
閱讀 1745·2019-08-30 15:52
閱讀 675·2019-08-30 15:44
閱讀 3613·2019-08-29 13:23
閱讀 2007·2019-08-26 13:33