1. 程式人生 > >事件流(事件冒泡、事件捕獲以及DOM事件流)

事件流(事件冒泡、事件捕獲以及DOM事件流)

事件流:描述的是從頁面中接收事件的順序。

事件冒泡:IE的事件流叫做事件冒泡,即事件開始時由最具體的元素(文件中巢狀層次最深的那個節點)接收,然後逐級上傳播到較為不具體的節點(文件)。

示例程式碼:

<!DOCTYPE html>
<html>
<head>
    <title>Event Bubbing Example</title>
</head>
<body>
    <div id="myDiv">Click Me</div>
</body>
</html>

如果你單擊了頁面中的<div>元素,那麼這個click事件會按照以下順序傳播:
1.<div>
2.<body>
3.<html>
4.doument

click事件首先在<div>元素上發生,而這個元素就是我們單擊的元素。然後,click事件沿DOM樹向上傳播,每一級節點都會發生,直至傳播到 document 物件。
所有現代瀏覽器都支援事件冒泡,但在具體實現上還是有差別的:IE5.5 及更早版本中的事件冒泡會跳過 元素(從)直接跳到 document)。IE9、Firefox、Chrome 和 Safari 則將事件一直冒泡到 window 物件。

事件捕獲:是由 Netscape Communicator 團隊提出的另一種事件流。事件捕獲的思想是不太具體的節點應該更早接收到事件,而最具體的節點應該最後接收到事件。事件捕獲的用意在於在事件到達預定目標之前捕獲它

以上面的 HTML 頁面作為演示事件捕獲的例子,那麼點選 <div>元素就會出現以下列順序觸發 click 事件:
1.document
2.<html>
3.<body>
4.<div>
在事件捕獲過程中,document 物件首先接收到click事件,然後事件沿DOM樹依次向下,一直傳播到事件的實際目標,即 <div>

元素。
IE9、Safari、Chrome、Opera 和 Firefox 目前也都支援這種事件流模型。儘管“DOM2 級事件”規範事件應該從 document 物件開始傳播,但這些瀏覽器都是從 window 物件開始捕獲事件的。
由於老版本的瀏覽器不支援,因此很少有人使用事件捕獲。建議使用事件冒泡,在特殊需要使用事件捕獲。

DOM事件流:“DOM2 級事件 ”規定的事件包括是3個階段:事件捕獲階段、處於目標階段和事件冒泡階段。首先發生的是事件捕獲,為截獲事件提供機會。然後是實際的目標接收到事件。最後一個階段是冒泡階段,可以在這個階段對事件作出響應。

以前面的簡單的 HTML 頁面為例,單擊<div>元素:在DOM事件流中,實際的目標(<div>元素)在捕獲階段不會接收到事件。這意味著在捕獲階段,事件從 document 到<html> 再到<body>後就停止了。下個階段是“處於目標”階段,於是事件在<div>上發生,並在事件處理中被看成冒泡階段的一部分。然後,冒泡階段發生,事件又傳播迴文檔。
多數支援 DOM 事件流的瀏覽器都實現了一種特定的行為;即使“DOM2級事件”規範明確要求捕獲階段不會涉及目標,但IE9、Safari、Chrome、Firefox 和 Opera 9.5 及更高版本都會在捕獲階段觸發物件上的事件。結果就是有兩個機會在目標物件上面操作事件。