日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Javascript 裝載和執行

瀏覽:19日期:2023-11-23 17:28:32

一兩個月前在淘寶內網里看到一個優化Javascript代碼的競賽,發現有不少的人對Javascript的執行和裝載的基礎并不懂,所以,從那天起我就想寫一篇文章,但一直耽擱了。自上篇《瀏覽器渲染原理簡介》,正好也可以承前啟后。

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

因為javascript可能會來操作HTML文檔的DOM樹,所以,瀏覽器一般都不會像并行下載css文件并行下載js文件,因為這是js文件的特殊性造成的。所以,如果你的javascript想操作后面的DOM元素,基本上來說,瀏覽器都會報錯說對象找不到。因為Javascript執行時,后面的HTML被阻塞住了,DOM樹時還沒有后面的DOM結點。所以程序也就報錯了。

傳統的方式

所以,當你在代碼中寫下如下的代碼:

<scripttype='text/javascript' src='http://coolshell.cn/asyncjs/alert.js'></script>

基本上來說,head里的 <script>標簽會阻塞后續資源的載入以及整個頁面的生成。我專門做了一個示例你可以看看:示例一。 注意:我的alert.js中只有一句話:alert(“hello world”) ,這更容易讓你看到javascript是怎么阻塞后面的東西的。

所以,你知道為什么有很多網站把javascript放在網頁的最后面了,要么就是動用了window.onload或是docmuemt ready之類的事件。

另外,因為絕大多數的Javascript代碼并不需要等頁面,所以,我們異步載入的功能。那么我們怎么異步載入呢?

document.write方式

于是,你可能以為document.write()這種方式能夠解決不阻塞的方式。你當然會覺得,document.write了的<script>標簽后就可以執行后面的東西去了,這沒錯。對于在同一個script標簽里的Javascript的代碼來說,是這樣的,但是對于整個頁面來說,這個還是會阻塞。 下面是一段測試代碼:

<scripttype='text/javascript'language='javascript'> function loadjs(script_filename) {document.write(’<’ + ’script language='javascript' type='text/javascript'’);document.write(’ src='http://www.b3g6.com/bcjs/’ + script_filename + ’'>’);document.write(’<’+’/script’+’>’);alert('loadjs() exit...'); } var script = ’http://coolshell.cn/asyncjs/alert.js’; loadjs(script); alert('loadjs() finished!');</script><scripttype='text/javascript'language='javascript'> alert('another block');</script>

你覺得alert的順序是什么?你可以在不同的瀏覽器里試一試。這里的想關的測試頁面:示例二。

script的defer和async屬性

IE自從IE6就支持defer標簽,如:

<scriptdefertype='text/javascript'src='http://www.b3g6.com/bcjs/alert.js'></script>

對于IE來說,這個標簽會讓IE并行下載js文件,并且把其執行hold到了整個DOM裝載完畢(DOMContentLoaded),多個defer的<script>在執行時也會按照其出現的順序來運行。最重要的是<script>被加上defer后,其不會阻塞后續DOM的的渲染。但是因為這個defer只是IE專用,所以一般用得比較少。

而我們標準的的HTML5也加入了一個異步載入javascript的屬性:async,無論你對它賦什么樣的值,只要它出現,它就開始異步加載js文件。但是, async的異步加載會有一個比較嚴重的問題,那就是它忠實地踐行著“載入后馬上執行”這條軍規,所以,雖然它并不阻塞頁面的渲染,但是你也無法控制他執行的次序和時機。你可以看看這個示例去感受一下。

支持 async標簽的瀏覽器是:Firefox3.6+,Chrome 8.0+,Safari 5.0+,IE 10+,Opera還不支持(來自這里)所以這個方法也不是太好。因為并不是所有的瀏覽器你都能行。

動態創建DOM方式

這種方式可能是用得最多的了。

functionloadjs(script_filename) { varscript = document.createElement(’script’); script.setAttribute(’type’,’text/javascript’); script.setAttribute(’src’, script_filename); script.setAttribute(’id’,’coolshell_script_id’); script_id = document.getElementById(’coolshell_script_id’); if(script_id){document.getElementsByTagName(’head’)[0].removeChild(script_id); } document.getElementsByTagName(’head’)[0].appendChild(script);}varscript =’http://coolshell.cn/asyncjs/alert.js’;loadjs(script);

這個方式幾乎成了標準的異步載入js文件的方式,這個方式的演示請參看:示例三。這方式還被玩出了JSONP的東東,也就是我可以為script的src指定某個后臺的腳本(如PHP),而這個PHP返回一個javascript函數,其參數是一個json的字符串,返回來調用我們的預先定義好的javascript的函數。你可以看一下這個示例:t.js (這個示例是我之前在微博征集的一個異步ajax調用的小例子)

按需異步載入js

上面那個DOM方式的例子解決了異步載入Javascript的問題,但是沒有解決我們想讓他按我們指定的時機運行的問題。所以,我們只需要把上面那個DOM方式綁到某個事件上來就可以了。

比如:

綁在window.load事件上——示例四

你一定要比較一下示例四和示例三在執行上有什么不同,我在這兩個示例中都專門用了個代碼高亮的javascript,看看那個代碼高亮的的腳本的執行和我的alert.js的執行的情況,你就知道不同了)

window.load = loadjs('http://coolshell.cn/asyncjs/alert.js')

綁在特定的事件上——示例五

<pstyle='cursor: pointer'onclick='LoadJS()'>Click to load alert.js </p>

這個示例很簡單了。當你點擊某個DOM元素,才會真正載入我們的alert.js。

更多

但是,綁定在某個特定事件上這個事似乎又過了一點,因為只有在點擊的時候才會去真正的下載js,這又會太慢了了。好了,到這里,要拋出我們的終極問題——我們想要異步地把js文件下載到用戶的本地,但是不執行,僅當在我們想要執行的時候去執行

要是我們有下面這樣的方式就好了:

varscript = document.createElement('script');script.noexecute =true;script.src ='http://www.b3g6.com/bcjs/alert.js';document.body.appendChild(script);//后面我們可以這么干script.execute();

可惜的是,這只是一個美麗的夢想,今天我們的Javascript還比較原始,這個“JS夢”還沒有實現呢。

所以,我們的程序員只能使用hack的方式來搞。

有的程序員使用了非標準的script的type來cache javascript。如:

<scripttype=cache/scriptsrc='./alert.js'></script>

因為”cache/script”,這個東西根本就不能被瀏覽器解析,所以瀏覽器也就不能把alert.js當javascript去執行,但是他又要去下載js文件,所以就可以搞定了??上У氖牵瑆ebkit嚴格符從了HTML的標準——對于這種不認識的東西,直接刪除,什么也不干。于是,我們的夢又破了。

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

functioncachejs(script_filename){ varcache = document.createElement(’object’); cache.data = script_filename; cache.id ='coolshell_script_cache_id'; cache.width = 0; cache.height = 0; document.body.appendChild(cache);}

然后,我們在的最后調用一下這個函數。請參看一下相關的示例:示例六

在Chrome下按 Ctrl+Shit+I,切換到network頁,你就可以看到下載了alert.js但是沒有執行,然后我們再用示例五的方式,因為瀏覽器端有緩存了,不會再從服務器上下載alert.js了。所以,就能保證執行速度了。

關于這種preload這種東西你應該不會陌生了。你還可以使用Ajax的方式,如:

varxhr =newXMLHttpRequest();xhr.open(’GET’,’new.js’);xhr.send(’’);

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

最后再提兩個js,一個是ControlJS,一個叫HeadJS,專門用來做異步load javascript文件的。

好了,這是所有的內容了,希望大家看過后能對Javascript的載入和執行,以及相關的技術有個了解。同時,也希望各前端高手不吝賜教!

注:本文轉自酷殼網

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国内精品自在自线400部| 亚洲一区日韩| 一区二区三区网站| 丝袜美腿高跟呻吟高潮一区| 九一成人免费视频| 啪啪国产精品| 日韩电影在线视频| 久久中文字幕av| 国产精品日韩久久久| 亚洲色图国产| 欧美日韩午夜| 丁香婷婷久久| 欧美高清一区| 伊人精品久久| 中文一区一区三区免费在线观 | 日本成人中文字幕| 首页国产欧美久久| 日韩av一区二| xxxxx性欧美特大| 亚洲国产日韩欧美在线| 亚洲在线免费| 欧美日韩午夜电影网| 高清av不卡| 免费欧美一区| 精品99久久| 免费在线观看成人| 精品国产乱码久久久| 深夜视频一区二区| 视频精品一区二区| 欧美国产不卡| 91久久黄色| 国产91在线播放精品| 丝袜美腿一区二区三区| 另类欧美日韩国产在线| 国产亚洲亚洲| 日韩88av| 欧美日韩xxxx| 99riav1国产精品视频| 日产精品一区二区| 欧美久久久网站| 蜜臀久久久99精品久久久久久| 麻豆国产精品| 亚洲精品伊人| 国产精品成人一区二区不卡| 奶水喷射视频一区| 日韩av免费| 成人污污视频| 久久国产精品色av免费看| 在线成人直播| 亚洲成人va| 国产成人精品亚洲线观看 | 亚洲激情二区| 欧美激情视频一区二区三区免费 | 亚洲天堂日韩在线| 一区二区三区视频免费观看| 久久av综合| 国产精品一区高清| 欧美日本二区| 日韩精品三级| 亚洲精品少妇| 中文字幕一区二区三区四区久久 | 国产精品66| 国产欧美二区| 国产精品免费精品自在线观看| 亚洲香蕉久久| 欧美精品黄色| 久久国产99| 视频一区二区中文字幕| 亚洲va久久久噜噜噜久久| 一区二区国产在线| 日韩二区在线观看| 国产精品亚洲欧美一级在线| 国产精品99久久免费| 国产伊人久久| 亚洲成人不卡| 在线综合视频| 日韩精品a在线观看91| 国产精品久久久久久久久久白浆 | 夜夜嗨一区二区| 美女网站久久| 欧美精品三级在线| 精品不卡一区| 九一国产精品| 国产亚洲一区二区三区啪| 成人在线视频区| 一区在线观看| 国产日产精品_国产精品毛片 | 蜜桃av一区二区| 国产精品视频首页| 激情久久99| 亚洲精品极品少妇16p| 欧美日本二区| 妖精视频成人观看www| 99riav国产精品| 久久国产成人| 亚洲精品成a人ⅴ香蕉片| 亚洲美女91| 午夜亚洲福利| 久久精品九色| 亚洲综合不卡| 97精品国产一区二区三区| 久久午夜视频| 日韩电影免费在线观看| 91福利精品在线观看| 精品一区亚洲| 国产aa精品| 免费精品一区| 日韩一区精品| 国产精品色网| 欧美在线影院| 蜜臀久久精品| 精品三级国产| 国产精选久久| 免费人成精品欧美精品| а√天堂中文在线资源8| 欧美综合社区国产| 深夜福利一区| 在线免费观看亚洲| 99国产精品私拍| 国产综合精品| 欧美日韩在线网站| 亚洲va中文在线播放免费| 国产精品2023| 国模精品一区| 老司机精品视频网| 日韩精品一区二区三区免费观看| 亚洲欧洲av| 国产精品高清一区二区| 午夜日韩福利| 精品91久久久久| 夜久久久久久| 视频一区中文| 亚洲丝袜啪啪| 日韩不卡一区二区三区| 久久精品97| 久久不卡日韩美女| 国产成人免费| 国产真实久久| 日韩在线观看一区二区三区| 国产午夜一区| yellow在线观看网址| 婷婷丁香综合| 日韩福利视频网| 国际精品欧美精品| 欧美片第1页| 蜜臀久久久99精品久久久久久| 日本成人精品| 国产精品伦理久久久久久| 99精品电影| 无码日韩精品一区二区免费| 国产精品三p一区二区| 日韩在线不卡| 亚洲影院天堂中文av色| 欧美成人aaa| 亚洲一区国产一区| 免费一级欧美片在线观看网站 | 国产手机视频一区二区 | 国产v综合v| 中文字幕成人| 国产成人精品一区二区三区视频| 欧美/亚洲一区| 六月丁香综合在线视频| 99国产精品久久久久久久成人热| 日本欧美久久久久免费播放网| 精品国产一区二| 亚洲永久精品唐人导航网址| 国产专区精品| 青草av.久久免费一区| 成人亚洲欧美| 综合欧美精品| 欧美成人久久| 亚洲最新无码中文字幕久久 | 亚洲精品免费观看| 黄色在线观看www| 国产精品一区二区三区av| 国产日韩专区| 久久精品中文| 国产精品国产一区| 欧美日韩在线精品一区二区三区激情综合| 福利一区视频| 久久久国产精品网站| 日本亚洲视频| 午夜在线精品| 精品一区三区| 性欧美xxxx免费岛国不卡电影| 国产精品igao视频网网址不卡日韩| 亚洲欧美网站| 国产亚洲在线观看| 国产99久久| 久久精品动漫| 成人日韩精品| 免费在线亚洲欧美| 国产精品mm| 麻豆精品蜜桃视频网站| 中文不卡在线| 综合一区在线| 日韩中出av| 欧美日韩夜夜| 久久久精品国产**网站| 国产欧美一区|