詳解javascript事件冒泡
事件是javascript中的核心內(nèi)容之一,在對(duì)事件的應(yīng)用中不可避免的要涉及到一個(gè)重要的概念,那就是事件冒泡,在介紹事件冒泡之前,先介紹一下另一個(gè)重要的概念事件流:
一.什么是事件流:
文檔對(duì)象模型(DOM)是一個(gè)樹(shù)形結(jié)構(gòu),可以形象的用下圖表示。
如果一個(gè)html元素觸發(fā)事件,那么這個(gè)事件就會(huì)在DOM樹(shù)中的觸發(fā)節(jié)點(diǎn)和根節(jié)點(diǎn)之間按照一定的順序傳播,所有經(jīng)過(guò)的節(jié)點(diǎn)都會(huì)接收到被觸發(fā)的事件,這個(gè)傳播過(guò)程被稱(chēng)之為事件流。按照事件的傳播順序,可以將其分為兩類(lèi),一種是事件冒泡,一種是事件捕獲,這里就涉及到本章要介紹的主題了:
1.事件冒泡:
所謂的時(shí)間冒泡就是當(dāng)一個(gè)元素觸發(fā)一個(gè)事件,事件會(huì)像是水泡一樣,從觸發(fā)元素向它的所有父節(jié)點(diǎn)傳播,一直到根節(jié)點(diǎn)都會(huì)接收到此事件,如果父元素中注冊(cè)了相應(yīng)的事件處理函數(shù),那么盡管事件在子節(jié)點(diǎn)觸發(fā)的,在父元素上注冊(cè)的事件處理函數(shù)同樣會(huì)被觸發(fā)。例如在上面圖示中,如果觸發(fā)a元素的onclick事件,那么它的父元素p、document和widow都會(huì)接收到此事件,并且如果在相應(yīng)的父元素注冊(cè)有時(shí)間處理函數(shù),那么此事件處理函數(shù)將會(huì)執(zhí)行,看一段代碼實(shí)例:
<html> <head> <meta charset="utf-8"/> <title>事件冒泡簡(jiǎn)單介紹</title> <script type="text/javascript"> window.onload=function(){ var table=document.getElementById("mytable"); table.onclick=function(e){ var event=e||window.event; target=event.srcElement||event.target; alert(target.innerHTML); } } </script> </head> <body> <table width="400" border="1" id="mytable"> <tr> <td>腳本之家</td> <td>腳本之家</td> <td>腳本之家</td> </tr> <tr> <td>腳本之家</td> <td>腳本之家</td> <td>腳本之家</td> </tr> <tr> <td>腳本之家</td> <td>腳本之家</td> <td>腳本之家</td> </tr> </table> </body> </html>
以上代碼的目的是,當(dāng)點(diǎn)擊相應(yīng)的單元格的時(shí)候就會(huì)彈出對(duì)應(yīng)單元格中的內(nèi)容。但是在上面的實(shí)現(xiàn)中并不是為每一個(gè)單元格注冊(cè)onclick事件處理函數(shù),而是將onclick事件處理函數(shù)注冊(cè)于單元格的父元素table上,當(dāng)點(diǎn)擊單元格的時(shí)候會(huì)觸發(fā)onclick事件,事件還會(huì)從從事件對(duì)象向上傳播,而table元素恰好有注冊(cè)的onclick事件處理函數(shù),這個(gè)時(shí)候就會(huì)執(zhí)行此處理函數(shù),當(dāng)然這里會(huì)設(shè)置到傳遞事件對(duì)象參數(shù)的問(wèn)題。所有的瀏覽器都支持事件冒泡。二.事件捕獲:
事件捕獲和事件冒泡恰好相反,當(dāng)點(diǎn)擊一個(gè)元素的時(shí)候,事件傳播的方向是從根元素到觸發(fā)元素,IE瀏覽器并不支持,為了跨瀏覽器支持,所以默認(rèn)情況下一般都是使用冒泡型事件處理模型。
2.javascript阻止事件冒泡代碼
事件冒泡在某些場(chǎng)景非常的有用,但是有時(shí)候也是必須要阻止,下面是一段能夠兼容所有主流瀏覽器的阻止事件冒泡的實(shí)例代碼。
代碼實(shí)例:
function stopBubble(e) { if(e&&e.stopPropagation) { e.stopPropagation(); } else { window.event.cancelBubble=true; } }
以上代碼可以阻止事件冒泡,下面對(duì)代碼做一下簡(jiǎn)單注釋:
二、代碼注釋:
- 1.function stopBubble(e) {},此函數(shù)用來(lái)阻止事件冒泡,參數(shù)是個(gè)事件對(duì)象。
- 2. if(e&&e.stopPropagation){e.stopPropagation();},判斷是否支持stopPropagation,如果支持就使用e.stopPropagation()。stopPropagation()函數(shù)IE10和IE10以下瀏覽器不支持。
- 3.window.event.cancelBubble=true,當(dāng)前IE瀏覽器使用這個(gè)可以阻止事件冒泡。
以上就是關(guān)于javascript事件冒泡的詳細(xì)介紹,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
javascript簡(jiǎn)單實(shí)現(xiàn)類(lèi)似QQ頭像彈出效果的方法
這篇文章主要介紹了javascript簡(jiǎn)單實(shí)現(xiàn)類(lèi)似QQ頭像彈出效果的方法,可實(shí)現(xiàn)簡(jiǎn)單的頁(yè)面元素彈出效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08使用 JavaScript如何獲取當(dāng)月的第一天和最后一天
這篇文章主要介紹了使用 JavaScript如何獲取當(dāng)月的第一天和最后一天,通過(guò)本文學(xué)習(xí)了如何使用 JavaScript 中的Date.getFullYear()和?Date.getMonth()方法獲得某個(gè)特定月份的第一天和最后一天,需要的朋友可以參考下2023-05-05關(guān)于對(duì)async?await效率問(wèn)題的深入思考
這篇文章主要給大家介紹了關(guān)于對(duì)async?await效率問(wèn)題的深入思考,async和await要搭配Promise使用,它進(jìn)一步極大的改進(jìn)了Promise的寫(xiě)法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01JS的時(shí)間格式化和時(shí)間戳轉(zhuǎn)換函數(shù)示例詳解
這篇文章主要介紹了JS的時(shí)間格式化和時(shí)間戳轉(zhuǎn)換函數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07javascript實(shí)現(xiàn)信息增刪改查的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)信息增刪改查的方法,實(shí)例分析了javascript操作頁(yè)面元素實(shí)現(xiàn)針對(duì)頁(yè)面信息的增刪改查功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07詳解webpack import()動(dòng)態(tài)加載模塊踩坑
這篇文章主要介紹了詳解webpack import()動(dòng)態(tài)加載模塊踩坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07你不知道的 TypeScript 高級(jí)類(lèi)型(小結(jié))
這篇文章主要介紹了你不知道的 TypeScript 高級(jí)類(lèi)型(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08