討論html與javascript在瀏覽器中的加載順序問題
前一陣子橫掃了javascript,當(dāng)時自我感覺良好?,F(xiàn)在一想,又覺得沒什么。今天的任務(wù)是把asp.net ajax中客戶端頁面生命周期那一章研究完。然而,因為這一章的內(nèi)容使我產(chǎn)生了一些迷惑。這些疑惑在書中都沒有只字提及。
一、html頁面的詳細(xì)加載過程是什么呢?頁面元素在加載時的優(yōu)先級是什么?
二、javascript的作用域、變量的作用域、不同腳本段之間的關(guān)系?
三、html頁面的生命周期?
這些問題真的打中了我的死穴。不了解這些,我就無法透過asp.net ajax的框架看到其底層原理。只知其然而不知其所以然。
在網(wǎng)上廣泛查閱資料的情況下。獲得了部分答案。
關(guān)于html的加載:
總體上,html的是按從上到下的順序邊加載邊解析,邊生成dom對象,至于在html中夾雜的:
document.write("xxxx");
<script type="text/javascript" src="aaa.js"></script>
之類的東西,它們的順序是怎樣的呢?還是一樣,如果在解析html時,遇到這些東西就會停止解析,轉(zhuǎn)而執(zhí)行這些生成語句,如果中間外部鏈接,就轉(zhuǎn)而解析、執(zhí)行外部鏈接對應(yīng)的js。對于以下語句對于不同瀏覽器存在不同的結(jié)果:
<script type="text/javascript" src="aaa.js"></script>
在ie中。不會等待aaa.js下載并解析完的,會創(chuàng)建另一線程搞定它,而主線程則越過去。但在ff中。則會等待,直到aaa.js下載、解析、執(zhí)行完畢。
關(guān)于javascript的執(zhí)行情況,請見本文后面所附的參考資料,里面有詳盡的討論。
關(guān)于html中頁面的生命周期:
最重要的兩個事件就是onLoad、onUnLoad。onLoad在頁面加載完畢的時候觸發(fā)。onUnLoad在頁面的dom銷毀完后觸發(fā)。不過,onLoad有點特殊狀況,也請參見本文后面所附的參考資料。一定要引起注意。
我看了幾個站點的html源碼,發(fā)現(xiàn)如下代碼:
<div class="ad1602"><script src="/ggjs/view1602_w.js"></script></div>
這是某網(wǎng)站在頁面中顯示廣告的代碼,國內(nèi)網(wǎng)站,顯示廣告一般都是用iframe來引入第三方頁面,這兒卻是直接用javascript段來生成。后來,我又看了163博客生成的html代碼。整個html代碼只有一個架子,所有頁面的生成都是通過js。我看到它的頁面后面引入了幾個js文件,最后在頁面最后還有一個initAll函數(shù)的調(diào)用。我沒有去仔細(xì)研究它的js代碼,我懷疑它把所有表現(xiàn)層的功能全面放到客戶端的js文件中去了。服務(wù)器端僅僅是很少的頁面架子和許多的webservices。真是嘆為觀止啊。
關(guān)于一個事件觸發(fā)多個響應(yīng)函數(shù):
我曾想過要自己實現(xiàn)一個c#中一樣的東西??梢宰宩avascript的事件不止是關(guān)聯(lián)到一個function??梢砸淮斡|發(fā)一個事件列表。這幾天研究asp.net ajax,里面對此有封裝。
asp.net ajax中,可以把一個dom元素封裝成asp.net ajax中的Sys.UI.DomElement對象。然后就可以用它的方法:addHandler()、addHandlers()、removeHander()來操作事件列表。真是方便啊。當(dāng)時不大明白這個原理。今天看到后面參考資料中的兩段代碼讓我徹底明白這中間的細(xì)節(jié):
一、使用dom 2中的接口:
if(document.addEventListener){
window.addEventListener('load',f,false);
window.addEventListener('load',f1,false);
……
}else{
window.attachEvent('onload',f);
window.attachEvent('onload',f1);
……
}
原來,dom中早有這個概念了。才曉得??磥?,我對dom還是有許多不了解的地方啊。
二、這個方法就是純手實現(xiàn)了。請參見下面代碼:
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
} else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
這個函數(shù)寫得很巧妙。利用匿名函數(shù)搞定!
相關(guān)文章
js 關(guān)于=+與+=日期函數(shù)使用說明(賦值運算符)
js 關(guān)于=+與+=日期函數(shù)使用說明(賦值運算符),可以看下,就是一些運算符的使用,看哪個更適合你。2011-11-11JavaScript 實現(xiàn)完美兼容多瀏覽器的復(fù)制功能代碼
這兩天在做Web前端時,遇到需求通過js實現(xiàn)文本復(fù)制的功能。經(jīng)過一番測試,終于實現(xiàn)了出來,有需要的小伙伴可以參考下。2015-04-04如何用js將blob為pcm格式轉(zhuǎn)換為MP3格式
要將PCM文件轉(zhuǎn)換為MP3文件,您可以使用Js實現(xiàn),這篇文章主要給大家介紹了關(guān)于如何用js將blob為pcm格式轉(zhuǎn)換為MP3格式的相關(guān)資料,需要的朋友可以參考下2023-11-11獲取Javscript執(zhí)行函數(shù)名稱的方法
獲取Javscript執(zhí)行函數(shù)名稱的方法...2006-12-12