天天看點

如何了解JavaScript中的事件冒泡和事件捕獲

事件冒泡

IE 的事件流叫做事件冒泡(event bubbling),即事件開始時由最具體的元素(文檔中嵌套層次最深的那個節點)接收,然後逐級向上傳播到較為不具體的節點(文檔)。以下面的 HTML 頁面為例:

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

如果你單擊了頁面中的 <div> 元素,那麼這個 click 事件會按照如下順序傳播:

(1) <div>
(2) <body>
(3) <html>
(4) document
           

也就是說, click 事件首先在 <div> 元素上發生,而這個元素就是我們單擊的元素。然後, click事件沿 DOM 樹向上傳播,在每一級節點上都會發生,直至傳播到 document 對象。

所有現代浏覽器都支援事件冒泡,但在具體實作上還是有一些差别。IE5.5 及更早版本中的事件冒泡會跳過 <html> 元素(從 <body> 直接跳到 document )。IE9、Firefox、Chrome 和 Safari 則将事件一直冒泡到 window 對象。

事件捕獲

在事件捕獲過程中, document 對象首先接收到 click 事件,然後事件沿 DOM 樹依次向下,一直傳播到事件的實際目标,即 <div> 元素。

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

如果你單擊了頁面中的 <div> 元素,那麼這個 click 事件會按照如下順序傳播:

(1) document
(2) <html>
(3) <body>
(4) <div>
           

雖然事件捕獲是 Netscape Communicator 唯一支援的事件流模型,但 IE9、Safari、Chrome、Opera和 Firefox 目前也都支援這種事件流模型。盡管“DOM2 級事件”規範要求事件應該從 document 對象開始傳播,但這些浏覽器都是從 window 對象開始捕獲事件的。由于老版本的浏覽器不支援,是以很少有人使用事件捕獲。我們也建議讀者放心地使用事件冒泡,在有特殊需要時再使用事件捕獲。

繼續閱讀