關於html和javascript在瀏覽器中的載入順序問題的討論

來源:互聯網
上載者:User

轉自:http://www.cnblogs.com/beyondstorm/archive/2008/09/17/1292940.html

前一陣子橫掃了javascript,當時自我感覺良好。現在一想,又覺得沒什麼。今天的任務是把asp.net ajax中用戶端頁面生命週期那一章研究完。然而,因為這一章的內容使我產生了一些迷惑。這些疑惑在書中都沒有隻字提及。

一、html頁面的詳細載入過程是什麼呢?頁面元素在載入時的優先順序是什嗎?

  二、javascript的範圍、變數的範圍、不同指令碼段之間的關係?

  三、html頁面的生命週期?

  這些問題真的打中了我的死穴。不瞭解這些,我就無法透過asp.net ajax的架構看到其底層原理。只知其然而不知其所以然。

  在網上廣泛查閱資料的情況下。獲得了部分答案。

關於html的載入:

  總體上,html的是按從上到下的順序邊載入邊解析,邊產生dom對象,至於在html中夾雜的:

  document.write("xxxx");

  <script type="text/javascript" src="aaa.js"></script>

  之類的東西,它們的順序是怎樣的呢?還是一樣,如果在解析html時,遇到這些東西就會停止解析,轉而執行這些產生語句,如果中間插入外部連結,就轉而解析、執行外部連結對應的js。對於以下語句對於不同瀏覽器存在不同的結果:

  <script type="text/javascript" src="aaa.js"></script>

  在ie中。不會等待aaa.js下載並解析完的,會建立另一線程搞定它,而主線程則越過去。但在ff中。則會等待,直到aaa.js下載、解析、執行完畢。

關於javascript的執行情況,請見本文後面所附的參考資料,裡面有詳盡的討論。

關於html中頁面的生命週期:

  最重要的兩個事件就是onLoad、onUnLoad。onLoad在頁面載入完畢的時候觸發。onUnLoad在頁面的dom銷毀完後觸發。不過,onLoad有點特殊狀況,也請參見本文後面所附的參考資料。一定要引起注意。

  我看了幾個網站的html源碼,發現如下代碼:

<div class="ad1602"><script src="/ggjs/view1602_w.js"></script></div>

  這是某網站在頁面中顯示廣告的代碼,國內網站,顯示廣告一般都是用iframe來引入第三方頁面,這兒卻是直接用javascript段來產生。後來,我又看了163部落格產生的html代碼,超變態啊。整個html代碼只有一個架子,所有頁面的產生都是通過js。我看到它的頁面後面引入了幾個js檔案,最後在頁面最後還有一個initAll函數的調用。我沒有去仔細研究它的js代碼,我懷疑它把所有表現層的功能全面放到用戶端的js檔案中去了。伺服器端僅僅是很少的頁面架子和許多的webservices。真是歎為觀止啊。

關於一個事件觸發多個響應函數:

  我曾想過要自己實現一個c#中委託一樣的東西。可以讓javascript的事件不止是關聯到一個function。可以一次觸發一個事件列表。這幾天研究asp.net ajax,裡面對此有封裝。

  asp.net ajax中,可以把一個dom元素封裝成asp.net ajax中的Sys.UI.DomElement對象。然後就可以用它的方法:addHandler()、addHandlers()、removeHander()來操作事件列表。真是方便啊。當時不大明白這個原理。今天看到後面參考資料中的兩段代碼讓我徹底明白這中間的細節:

  一、使用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還是有許多不瞭解的地方啊。

  二、這個方法就是純手實現了。請參見下面代碼:

function addLoadEvent(func) {

   var oldonload = window.onload;

   if (typeof window.onload != 'function') {

    window.onload = func;

   } else {

     window.onload = function() {

       if (oldonload) {

         oldonload();

       }

       func();

     }

   }

}

這個函數寫得很巧妙。利用匿名函數搞定!

參考資料:

javascript 控制最佳化頁面 js 載入順序

html的載入過程

動態載入外部css或js檔案

如何減少網頁的記憶體與CPU佔用

Javascript在頁面載入時的執行順序

document.onLoad事件的奇怪現象

javascript中的attachEvent與addEventListener

判斷一個變數是否定義的方法

居然有js寫的Virtual OS

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.