jQuery中的事件傳播也即是javascript中的事件傳播。
事件傳播分為兩個階段,一個是Capture(捕獲)階段,另一個是Bubble(冒泡)階段。
下面就分別講一下這兩個階段。先用一張圖來總體表示一下:
比如說,我們點擊了頁面上id為picture的img元素,暫時只關心click事件,那么實際上它是從根元素html依次遞歸到點擊的元素,這里為img元素,當然如果點擊到了id為son的div元素,它就會遞歸到該div元素,這一階段稱為捕獲階段。該階段中如果有任何祖先元素監聽了click事件,那么都會觸發該事件。
那么,從點擊到的img元素開始,依次向祖先元素遞歸,一直到達頂級祖先元素,這一過程稱為冒泡階段。該階段中,如果有任何祖先元素監聽了click事件,也會觸發。
我們也可以概括為捕獲階段是從祖先元素(根節點)到達目標元素;冒泡階段是從目標元素到達祖先元素(根)。
明白了這一過程后,我們來看一段代碼:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$('*').each(function () {
var current = this;
this.addEventListener('click', function (event) {
say('捕獲' + current.tagName + '元素,id為' + current.id + ',目標元素:' + event.target.id);
}, true);
this.addEventListener('click', function (event) {
say('冒泡' + current.tagName + '元素,id為' + current.id + ',目標元素:' + event.target.id);
}, false);
})
});
function say(text) {
$('#show').append('<div>' + text + '</div>');
}
</script>
</head>
<body>
<div id='father'>
<div id='son'>
<img id="flower" alt="" src="images/Tulips.jpg" width="300px" height="200px" />
</div>
</div>
<div id="show">
</div>
</body>
</html>
代碼中使用了addEventListener方法為元素注冊事件。該方法的第一個參數為事件類型,第二個參數為回調方法,第三個參數為在哪一個階段捕獲事件,若為true則是捕獲階段,若為false則是冒泡階段。運行結果:
如果我們想在冒泡階段阻止事件向祖先元素傳播,我們也可以調用Event實例中的stopPropagation()方法。


