最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在頁面加載之后執(zhí)行JavaScript

 更新時(shí)間:2022年06月03日 17:24:49   作者:恪愚  
這篇文章主要介紹了在頁面加載之后執(zhí)行JavaScript的詳細(xì)過程,本文通過實(shí)例代碼文字解說給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

我們都知道,頁面加載是有順序的。讓我們先來理一下頁面的展示過程:

當(dāng)你輸入url并按下回車時(shí)

  1. 首先從本地查找域名,有的話直接用hosts文件里的ip地址,否則查詢DNS,得到ip地址
  2. 建立TCP連接——進(jìn)行“三次握手”
  3. 客戶端發(fā)送http請求
  4. 服務(wù)端處理,并返回結(jié)果給客戶端
  5. 關(guān)閉TCP連接——需要“四次揮手”
  6. 瀏覽器收到結(jié)果,開始解析資源(JS、CSS、HTML),解析HTML生成的dom樹,和同時(shí)解析css生成的cssom樹結(jié)合生成渲染樹
  7. 根據(jù)渲染樹渲染頁面

當(dāng)然,再詳細(xì)的比如:如何解析生成DOM樹、瀏覽器在三次握手四次揮手的同時(shí)做了什么、CSSOM樹是怎么和DOM樹 一一對應(yīng)的… 這些如果你不是在做系統(tǒng),似乎是無關(guān)緊要的 —— 至少對本文來說是這樣的。

經(jīng)過上面的步驟,瀏覽器已經(jīng)拿到了想要的結(jié)果,下一步:瀏覽器渲染進(jìn)程啟用多個(gè)線程協(xié)助完成頁面渲染

  • GUI渲染線程 ,負(fù)責(zé)渲染瀏覽器界面,解析HTML、css,構(gòu)建DOM樹和RenderObject樹,布局和繪制 ——一旦界面因?yàn)槟撤N操作引發(fā)了回流,此線程就會(huì)執(zhí)行
  • JS引擎線程 ——和GUI線程互斥,在js引擎執(zhí)行時(shí),GUI線程被掛起
  • 事件觸發(fā)線程 ——依賴js的隊(duì)列機(jī)制完成(當(dāng)一個(gè)事件觸發(fā)時(shí)該線程會(huì)把事件添加到待處理隊(duì)列的隊(duì)尾,等待js引擎處理)
  • 定時(shí)器觸發(fā)線程 ——依賴js的隊(duì)列機(jī)制完成
  • 異步http請求線程

這其中有一個(gè)重要的地方:JavaScript執(zhí)行線程和渲染線程互斥 !而且JavaScript線程的優(yōu)先級最高!
所以一旦在HTML中發(fā)現(xiàn)了<script> ,瀏覽器便會(huì)暫停其余HTML元素的顯示轉(zhuǎn)而去“馬上加載JS代碼”,這可能會(huì)導(dǎo)致兩個(gè)問題的發(fā)生:

  • 頁面「一片空白」
  • 報(bào)錯(cuò) —— JS無法訪問未知(還沒開始的)加載內(nèi)容

所以,我們需要一種方法來“暫停”JS執(zhí)行。

很多人第一時(shí)間會(huì)選擇 window.onload :恕我直言,這確實(shí)不是好的方法,它讓用戶等的太久了。你稍微一查就能知道:onload方法會(huì)等待頁面上所有的文字、table、img加載完成后才觸發(fā)。如果你真的要用,筆者倒是更推薦 DOMContentLoaded ,這個(gè)onload的“變異產(chǎn)品”會(huì)等到文字加載完成后立即觸發(fā) —— 你完全不必考慮圖片的大小對頁面初始加載時(shí)間的影響,如果你不會(huì)“調(diào)用”圖片的話(前面說了,JS無法訪問未知加載內(nèi)容)。

但事實(shí)上,我們更需要一種方法,讓JS在“瀏覽器獲得內(nèi)容后、真正展示在屏幕上前”就開始執(zhí)行。
比較幸運(yùn)(也可能是不幸)的是,jQuery實(shí)現(xiàn)了這個(gè)方法:

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

不過據(jù)說jQuery的ready和原生JS的DOMContentLoaded效果是一樣的:網(wǎng)頁中所有 DOM 結(jié)構(gòu)繪制完畢后就執(zhí)行(可能 DOM 元素關(guān)聯(lián)的內(nèi)容并沒有加載完)
除此之外,JS中的 window.onload 和jQuery中的 $(window).load() 是等價(jià)的

哦,這里并不是“盲目推崇”jQuery,你完全可以去自己封裝一個(gè)。比如 jQuery的 ready() 和JS的 DOMContentLoaded 實(shí)際上都實(shí)現(xiàn)了(或“基于”)這樣一段代碼:

function init(){
	if(arguments.callee.done) return;
	arguments.callee.done=true;
	if(timer) clearInterval(timer);
	//...
}

//判斷瀏覽器
//針對Mozilla/Opera9
if(document.addEventListener){
	document.addEventListener('DOMContentLoaded',init,false)
}
//針對IE
document.write ("<script id='__ie_onload defer' src='javascript:void(O);'><\/script>" );
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
	if( this.readyState == " complete" ) {
		init() //調(diào)用加截處理器
	};
}
//針對Safari 
if (/WebKit/i.test(navigator.userAgent)) {
	var timer = setinterval( function (){
		if( /loaded | complete/.test(document.readyState)) {
			init() //調(diào)用加載處理器
		}
}. 10);
//針對其他瀏覽器
window.onload = init;

到此這篇關(guān)于在頁面加載之后執(zhí)行JavaScript的文章就介紹到這了,更多相關(guān)頁面加載后執(zhí)行js內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js實(shí)現(xiàn)二級菜單點(diǎn)擊顯示當(dāng)前內(nèi)容效果

    js實(shí)現(xiàn)二級菜單點(diǎn)擊顯示當(dāng)前內(nèi)容效果

    這篇文章主要介紹了js實(shí)現(xiàn)二級菜單點(diǎn)擊顯示當(dāng)前內(nèi)容效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • layui table checked獲取選中數(shù)據(jù)方式

    layui table checked獲取選中數(shù)據(jù)方式

    這篇文章主要介紹了layui table checked獲取選中數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺析Bootstrap驗(yàn)證控件的使用

    淺析Bootstrap驗(yàn)證控件的使用

    這篇文章主要介紹了淺析Bootstrap驗(yàn)證控件的使用 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • js使用文件流下載csv文件的實(shí)現(xiàn)方法

    js使用文件流下載csv文件的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于js使用文件流下載csv文件的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 解決JS外部文件中文注釋出現(xiàn)亂碼問題

    解決JS外部文件中文注釋出現(xiàn)亂碼問題

    中文亂碼在Java Web開發(fā)中經(jīng)常出現(xiàn),這是由于不同的部分編碼不一樣造成的,一般在開發(fā)中,我們把所有能設(shè)編碼的地方,全部設(shè)置成UTF-8,但是有時(shí)候還是會(huì)出現(xiàn)亂碼的情況。下面通過本文給大家分享JS外部文件中文注釋出現(xiàn)亂碼的解決方案,一起看看吧
    2017-07-07
  • js canvas實(shí)現(xiàn)畫圖、濾鏡效果

    js canvas實(shí)現(xiàn)畫圖、濾鏡效果

    這篇文章主要為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)畫圖、濾鏡效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • JavaScript獲取頁面上被選中文字的方法技巧

    JavaScript獲取頁面上被選中文字的方法技巧

    這篇文章主要介紹了JavaScript獲取頁面上被選中文字的方法技巧,本文直接給出實(shí)現(xiàn)代碼和運(yùn)行效果,需要的朋友可以參考下
    2015-03-03
  • 深入理解JS中的Promise.race控制并發(fā)量

    深入理解JS中的Promise.race控制并發(fā)量

    這篇文章主要為大家介紹了JS中的Promise.race控制并發(fā)量的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 查找頁面中所有類為test的結(jié)點(diǎn)的方法

    查找頁面中所有類為test的結(jié)點(diǎn)的方法

    這篇文章主要介紹了查找頁面中所有類為test結(jié)點(diǎn)的方法,需要的朋友可以參考下
    2014-03-03
  • javascript中關(guān)于執(zhí)行環(huán)境的雜談

    javascript中關(guān)于執(zhí)行環(huán)境的雜談

    如你所知,javascript里執(zhí)行環(huán)境是作為一個(gè)最核心的概念存在的。相信廣大FE筒子們對于這個(gè)概念不會(huì)陌生,它定義了變量或函數(shù)有權(quán)訪問其他數(shù)據(jù)范圍以及其行為。
    2011-08-08

最新評論

荔浦县| 尖扎县| 甘孜县| 锦州市| 津市市| 镇坪县| 长子县| 澳门| 合江县| 闻喜县| 扶风县| 林芝县| 英山县| 漳州市| 噶尔县| 乌拉特前旗| 油尖旺区| 炉霍县| 吉林省| 合阳县| 西平县| 肇州县| 随州市| 永州市| 通州区| 巴里| 洞头县| 托克托县| 福鼎市| 德惠市| 当涂县| 安康市| 海兴县| 临武县| 凌云县| 嘉兴市| 淳化县| 承德县| 太保市| 齐河县| 宜州市|