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()方法。