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並不支持響應事件。