日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Javascript裝載和執(zhí)行

兩個(gè)月前在淘寶內(nèi)網(wǎng)里看到一個(gè)優(yōu)化Javascript代碼的競(jìng)賽,發(fā)現(xiàn)有不少的人對(duì)Javascript的執(zhí)行和裝載的基礎(chǔ)并不懂,所以,從那天起我就想寫一篇文章,但一直耽擱了。自上篇《瀏覽器渲染原理簡(jiǎn)介》,正好也可以承前啟后。

專注于為中小企業(yè)提供做網(wǎng)站、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)東湖免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

首先,我想說(shuō)一下Javascript的裝載和執(zhí)行。通常來(lái)說(shuō),瀏覽器對(duì)于Javascript的運(yùn)行有兩大特性:1)載入后馬上執(zhí)行,2)執(zhí)行時(shí)會(huì)阻塞頁(yè)面后續(xù)的內(nèi)容(包括頁(yè)面的渲染、其它資源的下載)。于是,如果有多個(gè)js文件被引入,那么對(duì)于瀏覽器來(lái)說(shuō),這些js文件被被串行地載入,并依次執(zhí)行。

因?yàn)閖avascript可能會(huì)來(lái)操作HTML文檔的DOM樹(shù),所以,瀏覽器一般都不會(huì)像并行下載css文件并行下載js文件,因?yàn)檫@是js文件的特殊性造成的。所以,如果你的javascript想操作后面的DOM元素,基本上來(lái)說(shuō),瀏覽器都會(huì)報(bào)錯(cuò)說(shuō)對(duì)象找不到。因?yàn)镴avascript執(zhí)行時(shí),后面的HTML被阻塞住了,DOM樹(shù)時(shí)還沒(méi)有后面的DOM結(jié)點(diǎn)。所以程序也就報(bào)錯(cuò)了。

傳統(tǒng)的方式

所以,當(dāng)你寫在代碼中寫下如下的代碼:

 
 
 
  1.  

基本上來(lái)說(shuō),head里的  

  •   
  •  
  • 你覺(jué)得alert的順序是什么?你可以在不同的瀏覽器里試一試。這里的想關(guān)的測(cè)試頁(yè)面:示例二。

    script的defer和async屬性

    IE自從IE6就支持defer標(biāo)簽,如:

     
     
     
    1.  

    對(duì)于IE來(lái)說(shuō),這個(gè)標(biāo)簽會(huì)讓IE并行下載js文件,并且把其執(zhí)行hold到了整個(gè)DOM裝載完畢(DOMContentLoaded),多個(gè) defer的 

    因?yàn)椤眂ache/script”,這個(gè)東西根本就不能被瀏覽器解析,所以瀏覽器也就不能把a(bǔ)lert.js當(dāng)javascript去執(zhí)行,但是他 又要去下載js文件,所以就可以搞定了。可惜的是,webkit嚴(yán)格符從了HTML的標(biāo)準(zhǔn)——對(duì)于這種不認(rèn)識(shí)的東西,直接刪除,什么也不干。于是,我們的 夢(mèng)又破了。

    所以,我們需要再hack一下,就像N多年前玩preload圖片那樣,我們可以動(dòng)用object標(biāo)簽(也可以動(dòng)用iframe標(biāo)簽),于是我們有下面這樣的代碼:

     
     
     
    1. function cachejs(script_filename){ 
    2.     var cache = document.createElement('object'); 
    3.     cache.data = script_filename; 
    4.     cache.id = "coolshell_script_cache_id"; 
    5.     cache.width = 0; 
    6.     cache.height = 0; 
    7.     document.body.appendChild(cache); 

    然后,我們?cè)诘淖詈笳{(diào)用一下這個(gè)函數(shù)。請(qǐng)參看一下相關(guān)的示例:示例六

    在Chrome下按 Ctrl+Shit+I,切換到network頁(yè),你就可以看到下載了alert.js但是沒(méi)有執(zhí)行,然后我們?cè)儆檬纠宓姆绞?,因?yàn)闉g覽器端有緩存了,不會(huì)再?gòu)姆?wù)器上下載alert.js了。所以,就能保證執(zhí)行速度了。

    關(guān)于這種preload這種東西你應(yīng)該不會(huì)陌生了。你還可以使用Ajax的方式,如:

     
     
     
    1. var xhr = new XMLHttpRequest(); 
    2. xhr.open('GET', 'new.js'); 
    3. xhr.send(''); 

    到這里我就不再多說(shuō)了,也不給示例了,大家可以自己試試去。

    最后再提兩個(gè)js,一個(gè)是ControlJS,一個(gè)叫HeadJS,專門用來(lái)做異步load javascript文件的。

    好了,這是所有的內(nèi)容了,希望大家看過(guò)后能對(duì)Javascript的載入和執(zhí)行,以及相關(guān)的技術(shù)有個(gè)了解。同時(shí),也希望各前端高手不吝賜教!

    ?原文鏈接:http://coolshell.cn/articles/9749.html


    分享題目:Javascript裝載和執(zhí)行
    標(biāo)題鏈接:http://www.5511xx.com/article/ccdseip.html