Javascript代碼在頁面加載時的執(zhí)行順序介紹
一、在HTML中嵌入Javasript的方法
1.直接在Javascript代碼放在標(biāo)記對<script>和</script>之間
2.由<script />標(biāo)記的src屬性制定外部的js文件
3.放在事件處理程序中,比如:<p onclick="alert('我是由onclick事件執(zhí)行的Javascript')">點擊我</p>
4.作為URL的主體,這個URL使用特殊的Javascript:協(xié)議,比如:<a href="javascript:alert('我是由javascript:協(xié)議執(zhí)行的javascript')">點擊我</a>
5.利用javascript本身的document.write()方法寫入新的javascript代碼
6.利用Ajax異步獲取javascript代碼,然后執(zhí)行
第3種和第4種方法寫入的Javascript需要觸發(fā)才能執(zhí)行,所以除非特別設(shè)置,否則頁面加載時不會執(zhí)行。
二、Javascript在頁面的執(zhí)行順序
1.頁面上的Javascript代碼是HTML文檔的一部分,所以Javascript在頁面裝載時執(zhí)行的順序就是其引入標(biāo)記<script />的出現(xiàn)順序, <script />標(biāo)記里面的或者通過src引入的外部JS,都是按照其語句出現(xiàn)的順序執(zhí)行,而且執(zhí)行過程是文檔裝載的一部分。
2.每個腳本定義的全局變量和函數(shù),都可以被后面執(zhí)行的腳本所調(diào)用。
3.變量的調(diào)用,必須是前面已經(jīng)聲明,否則獲取的變量值是undefined。
<script type="text/javscrpt">//<![CDATA[
alert(tmp); //輸出 undefined
var tmp = 1;
alert(tmp); //輸出 1
//]]></script>
4.同一段腳本,函數(shù)定義可以出現(xiàn)在函數(shù)調(diào)用的后面,但是如果是分別在兩段代碼,且函數(shù)調(diào)用在第一段代碼中,則會報函數(shù)未定義錯誤。
<script type="text/javscrpt">//<![CDATA[
aa(); //瀏覽器報錯
//]]></script>
<script type="text/javscrpt">//<![CDATA[
aa(); //輸出 1
function aa(){alert(1);}
//]]></script>
5.document.write()會把輸出寫入到腳本文檔所在的位置,瀏覽器解析完documemt.write()所在文檔內(nèi)容后,繼續(xù)解析document.write()輸出的內(nèi)容,然后在繼續(xù)解析HTML文檔。
<script type="text/javascript">//<![CDATA[
document.write('<script type="text/javascript" src="test.js"><\/script>');
document.write('<script type="text/javascript">');
document.write('alert(2);')
document.write('alert("我是" + tmpStr);');
document.write('<\/script>');
//]]></script>
<script type="text/javascript">//<![CDATA[
alert(3);
//]]></script>
test.js的內(nèi)容是:
var tmpStr = 1;
alert(tmpStr);
•在Firefox和Opera中的彈出值的順序是:1、2、我是1、3
•在IE中彈出值的順序是:2、1、3,同時瀏覽器報錯:tmpStr未定義
原因可能是IE在document.write時,并未等待加載SRC中的Javascript代碼完畢后,才執(zhí)行下一行,所以導(dǎo)致2先彈出,并且執(zhí)行到document.write(‘document.write("我是" + tmpStr)')調(diào)用tmpStr時,tmpStr并未定義,從而報錯。
解決這個問題,可以利用HTML解析是解析完一個HTML標(biāo)簽,再執(zhí)行下一個的原理,把代碼拆分來實現(xiàn):
<script type="text/javascript">//<![CDATA[
document.write('<script type="text/javascript" src="test.js"><\/script>');
//]]></script>
<script type="text/javascript">//<![CDATA[
document.write('<script type="text/javascript">');
document.write('alert(2);')
document.write('alert("我是" + tmpStr);');
document.write('<\/script>');
//]]></script>
<script type="text/javascript">//<![CDATA[
alert(3);
//]]></script>
這樣IE下和其他瀏覽器輸出值的順序都是一直的了:1、2、我是1、3。
三、如何改變Javascript在頁面的執(zhí)行順序
1.利用onload
<script type="text/javascript">//<![CDATA[
window.onload = f;
function f(){alert(1);}
alert(2);
//]]></script>
輸出值順序是 2、1。
需要注意的是,如果存在多個winodws.onload的話,只有最有一個生效,解決這個辦法是:
window.onload = function(){f();f1();f2();.....}
利用2級DOM事件類型
if(document.addEventListener){
window.addEventListener('load',f,false);
window.addEventListener('load',f1,false);
...
}else{
window.attachEvent('onload',f);
window.attachEvent('onload',f1);
...
}
2.IE中可以利用defer,defer作用是把代碼加載下來,并不立即執(zhí)行,等文檔裝載完畢之后再執(zhí)行,有點類似window.onload,但是沒有window.onload那樣的局限性,可以重復(fù)使用,但是只在IE中有效,所以上面的例子可以修改成為
<script type="text/javascript">//<![CDATA[
document.write('<script type="text/javascript" src="test.js"><\/script>');
document.write('<script type="text/javascript" defer="defer">');
document.write('alert(2);')
document.write('alert("我是" + tmpStr);');
document.write('<\/script>');
//]]></script>
<script type="text/javascript">//<![CDATA[
alert(3);
//]]></script>
這樣IE就不報錯了,輸出值的順序變成:1、3、2、我是1
當(dāng)HTML解析器遇到一個腳本,它必須按常規(guī)終止對文檔的解析并等待腳本執(zhí)行。為了解決這個問題HTML4標(biāo)準(zhǔn)定義了defer。通過defer來提示瀏覽器可以繼續(xù)解析HTML文檔,并延遲執(zhí)行腳本。這種延遲在腳本從外部文件載入時非常有用,讓瀏覽器不必等待外部文件全部載入之后才繼續(xù)執(zhí)行,能有效的提高性能。IE是目前唯一支持defer屬性的瀏覽器,但I(xiàn)E并沒有正確的實現(xiàn)了defer屬性,因為延遲的腳本總是被延遲,直到文檔結(jié)束,而不是只延遲到下一個非延遲的腳本。這意味著,IE中延遲的腳本的執(zhí)行順序相當(dāng)混亂,并且不能定義任何后面非延遲腳本并須的函數(shù)和變量。在IE中所有的defer的腳本執(zhí)行時間應(yīng)該都是HTML文檔樹建立以后,window.onload之前。
3.利用Ajax。
因為xmlhttpRequest能判斷外部文檔加載的狀態(tài),所以能夠改變代碼的加載順序
相關(guān)文章
JavaScript 基本數(shù)據(jù)類型轉(zhuǎn)換你了解嘛
這篇文章主要為大家介紹了JavaScript基本數(shù)據(jù)類型轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01第一個JavaScript入門基礎(chǔ) document.write輸出
關(guān)于JavaScript,他是一個OOSP(面向?qū)ο竽_本語言)他是用來創(chuàng)建動態(tài)網(wǎng)站,增強(qiáng)用戶界面的一門技術(shù)。如果你想了解更多關(guān)于JavaScript的信息,請去維基百科查詢。2010-02-02推薦一些非常不錯的javascript學(xué)習(xí)資源站點
推薦一些非常不錯的javascript學(xué)習(xí)資源站點...2007-08-08JavaScript學(xué)習(xí)筆記整理_關(guān)于表達(dá)式和語句
下面小編就為大家?guī)硪黄狫avaScript學(xué)習(xí)筆記整理_關(guān)于表達(dá)式和語句。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09JavaScript CSS修改學(xué)習(xí)第三章 修改樣式表
在這一章我打算通過直接修改頁面的樣式表而不是通過訪問元素的辦法來修改PRE的背景顏色。不幸的是,瀏覽器嚴(yán)重的不兼容性讓這個代碼基本上不能使用。2010-02-02BAT及各大互聯(lián)網(wǎng)公司2014前端筆試面試題--JavaScript篇
很多面試題是我自己面試BAT親身經(jīng)歷碰到的。整理分享出來希望更多的前端er共同進(jìn)步吧,不僅適用于求職者,對于鞏固復(fù)習(xí)js更是大有裨益2014-10-10