讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 第6章 客戶端編程 >

第6章 客戶端編程

HTML、JavaScript和CSS構成了客戶端開發的三塊基石,缺一不可。JavaScript通過事件處理模型實現與HTML的交互,而CSS可以直接作用於HTML結構。在JavaScript開發中,CSS的作用不容忽視,很多交互效果都需要CSS的配合才能夠實現。使用CSS和JavaScript可以創造出各種奇幻的視覺效果,利用腳本化CSS樣式的能力,可以動態改變HTML的顏色、字體等。更重要的是,可以用JavaScript設置和改變元素的位置,甚至隱藏或顯示元素,這意味著可以使用CSS設計動畫效果。

用戶交互的效果是通過操作與響應來實現的,執行操作的可以是人(即用戶),也可以是物(即瀏覽器),做出響應的是頁面上的各種對象,或者瀏覽器自身。在操作與響應之間,需要事件作為橋樑。鼠標單擊是一個事件,單擊按鈕就觸發了頁面響應,也許會彈出一個提示框,也許會提交表單信息,也許會關閉窗口等。所有這些行為都可以由開發人員自己去設計。

建議123:比較IE和W3C事件流

IE解決事件流的方案稱為冒泡(dubbed bubbling)技術。冒泡型事件流的基本思路:事件流按照從最特定的事件目標到最不特定的事件目標(document對像)的順序觸發。簡單概括為事件從下向上傳遞,這個傳遞過程猶如水冒泡一樣不斷上升到頂端。例如:


<script language=\"javascript\"type=\"text/javascript\">

function f(a){

alert(a);

}

</script>

<body onclick=\"f(\'BODY\')\">

<p onclick=\"f(\'P\')\">冒泡型事件</p>

</body>


在這個示例中,單擊段落文本會觸發事件流。首先響應的是p元素身上綁定的鼠標單擊事件,即彈出提示信息為「P」。接著響應的是body元素身上綁定的鼠標單擊事件,即彈出提示信息為「BODY」。整個事件流動的順序是從下(p元素)到上(body元素)的,如圖6.1所示。

圖 6.1 IE 6.0以下版本瀏覽器的冒泡過程

對於不同類型或版本的瀏覽器來說,冒泡型事件流的具體約定也略有不同。

❑IE 5.5及其以下版本:p→body→document。

❑IE 6.0及其以上版本:p→body→html→document。

❑Firefox:p→body→html→document→window。

從IE 6.0版本瀏覽器開始,html元素也可以接收到事件流,事件流能夠影響到html元素,而這在IE 5.5及其以下版本中是不允許的。例如:


<script language=\"javascript\"type=\"text/javascript\">

function f(a){

alert(a);

}

</script>

<html onclick=\"f(\'HTML\')\">

<body onclick=\"f(\'BODY\')\">

<p onclick=\"f(\'P\')\">冒泡型事件</p>

</body>

</html>


在這個示例中,單擊段落文本會觸發事件流。首先響應的是p元素身上綁定的鼠標單擊事件,接著響應的是body元素身上綁定的鼠標單擊事件,最後是html元素身上綁定的鼠標單擊事件,如圖6.2所示。Firefox類型瀏覽器支持冒泡型事件流,但它能夠影響到全局作用域,也就是說,事件流最後會影響到window對象,如圖6.3所示。

圖 6.2 IE 6.0及其以上版本瀏覽器的冒泡過程 圖 6.3 Firefox瀏覽器的冒泡過程

捕獲型事件流與冒泡型事件流正好相反,事件總是從最不精確的對象(document對像)開始觸發,最後到最精確的對象,即事件流從上到下按順序響應。該解決方案從Netscape 4.0版本瀏覽器開始得到支持。例如,上面的示例在Netscape 4.0及其以上版本瀏覽器中運行,單擊段落文本會首先觸發html元素,接著是body元素,最後是p元素,如圖6.4所示。

圖 6.4 Netscape 4.0及其以上版本瀏覽器的捕獲過程

DOM 2.0對事件流進行了標準化,同時支持冒泡型事件流和捕獲型事件流。DOM 2.0標準規定捕獲型事件流先進行響應,然後才響應冒泡型事件流。這兩種事件流會觸及DOM中的所有對象,從document對像開始,最後在document對像結束。

不過大部分瀏覽器在支持DOM標準事件流時,會影響window對象。例如,針對上面的示例,在兼容DOM標準的瀏覽器中單擊段落文本,事件流會按如圖6.5所示的過程進行傳導。

圖 6.5 DOM 2.0標準的事件流過程

在默認情況下,事件使用冒泡型事件流,開發者可以顯式設置並使用捕獲型事件流,方法是在註冊事件時傳入useCapture參數,將這個參數設為true。除了元素能夠響應事件外,DOM標準還規定文本節點也可以響應事件,但IE並不支持響應事件。