摘要:然而和分別提出了完全相反的的概念事件冒泡和事件捕獲。所有的節(jié)點(diǎn)中包含了這兩個(gè)方法,它們都接受個(gè)參數(shù)要處理的事件名作為事件處理程序的函數(shù)和一個(gè)布爾值。事件流級(jí)事件規(guī)定的事件流包括三個(gè)階段事件捕獲階段處于目標(biāo)階段事件冒泡階段。
事件流描述的是從頁(yè)面中接受事件的順序。然而ie和netscape分別提出了完全相反的的概念:事件冒泡和事件捕獲。下面就說(shuō)說(shuō)這兩種事件流:
事件冒泡事件冒泡,就是說(shuō)時(shí)間開(kāi)始時(shí)由具體的元素接受,然后逐級(jí)向上傳播到較為不具體的節(jié)點(diǎn)。看看下面的圖就比較清楚了:
比如說(shuō)在圖中的
在理解實(shí)例事前先說(shuō)說(shuō)實(shí)例用到的核心操作:addEventListener(),這是DOM2事件定義的方法,用于處理添加指定事件處理程序的操作,有添加的方法當(dāng)然也就會(huì)有刪除事件處理程序的方法removeEventListener()。所有的DOM節(jié)點(diǎn)中包含了這兩個(gè)方法,它們都接受3個(gè)參數(shù):要處理的事件名、作為事件處理程序的函數(shù)和一個(gè)布爾值。如果布爾值參數(shù)是false,表示在冒泡階段調(diào)用事件處理程序;如果是true,表示在捕獲階段調(diào)用事件處理程序(稍后會(huì)說(shuō)到事件捕獲),布爾值默認(rèn)參數(shù)是false。
Document 外部盒innerbox3
瀏覽器效果:
現(xiàn)在就說(shuō)說(shuō)實(shí)例中觸發(fā)事件的執(zhí)行順序,挺有意思的,容易被繞進(jìn)去:
點(diǎn)擊綠色區(qū)域
輸出的值也就是一個(gè)了。
點(diǎn)擊藍(lán)色區(qū)域
輸出的值有兩個(gè),這個(gè)為什么呢,原因很簡(jiǎn)單,藍(lán)色區(qū)域是在綠色區(qū)域內(nèi),藍(lán)色區(qū)域觸發(fā)click事件,在冒泡階段調(diào)用事件處理程序,點(diǎn)擊藍(lán)色區(qū)域,click事件沿DOM樹(shù)向上傳播,由類屬性為inner的元素的向上傳播到類屬性為box的元素,再依次向上傳播,故輸出的值為兩個(gè)。注意其輸出的順序:先輸出自身元素觸發(fā)事件中的值,然后再是父元素事件中的值。由內(nèi)向外,這也就是事件冒泡的核心內(nèi)容了。
點(diǎn)擊紅色區(qū)域
輸出的值有三個(gè),原因就不再解釋了,原因和上面的一樣,同時(shí)也要注意下它們的輸出順序。通過(guò)這個(gè)實(shí)例對(duì)事件冒泡有了解了,接下來(lái)我們來(lái)深入下:
在我們實(shí)際開(kāi)發(fā)中,是很不愿意事件在DOM層次中的傳播,很影響體驗(yàn)效果,如上實(shí)例,觸發(fā)紅色區(qū)域的元素,我只想輸出一個(gè)值,然而偏偏輸出了三個(gè)值,是不是很煩啊???這個(gè)還是有解決方案的,stopPropagation()方法用于立即停止事件在DOM層次中的傳播,即取消進(jìn)一步的事件冒泡或捕獲。看下面的例子(html代碼與上面實(shí)例一樣):
紅色區(qū)域停止傳播
先說(shuō)說(shuō)上面的代碼中涉及到的一個(gè)局部變量event,相信很多人對(duì)這個(gè)變量都不是很理解,我剛接觸的時(shí)候也不是很理解這個(gè)變量,為什么會(huì)有這個(gè)變量,這個(gè)變量干嘛用的,怎么還可以調(diào)用方法和屬性,好神奇啊!!!現(xiàn)在我就來(lái)說(shuō)說(shuō)這個(gè)局部變量,這個(gè)變量就是事件對(duì)象,在觸發(fā)DOM上的某個(gè)事件時(shí),會(huì)產(chǎn)生一個(gè)事件對(duì)象event,這個(gè)對(duì)象中包含了所有與事件有關(guān)的信息,包括了導(dǎo)致事件的元素、事件的類型以及其它與特定事件相關(guān)的信息。例如,鼠標(biāo)操作導(dǎo)致的事件對(duì)象中,會(huì)包含鼠標(biāo)位置的信息。
點(diǎn)擊紅色區(qū)域:
在紅色區(qū)域的click事件中加了stopPropagation(),這就立即停止了事件在DOM層次中的傳播,也就是取消進(jìn)一步的事件冒泡,輸出的值也就只有一個(gè)了。
分別點(diǎn)擊藍(lán)色區(qū)域、綠色區(qū)域:
從輸出可以看出,這兩部分沒(méi)有加stopPropagation(),事件依舊在DOM層次中的傳播,同時(shí)注意它們的輸出順序。
2.藍(lán)色區(qū)域停止傳播
點(diǎn)擊藍(lán)色區(qū)域
成功取消了事件冒泡,輸出的值是一個(gè)即本身觸發(fā)輸出,而不是兩個(gè)值。
點(diǎn)擊紅色區(qū)域
這個(gè)輸出了兩個(gè)值,不是三個(gè)值,或許會(huì)感到很好奇,我取消的是藍(lán)色區(qū)域的事件捕獲,為什么click紅色區(qū)域只輸出兩個(gè),其實(shí)正因?yàn)槟阍谒{(lán)色區(qū)域內(nèi)調(diào)用了stopPropagation()方法,其事件就會(huì)被停止冒泡,即使你點(diǎn)擊的是紅色區(qū)域,事件冒泡最終停留在藍(lán)色區(qū)域,傳播不到綠色區(qū)域,即輸出的值為兩個(gè)。
點(diǎn)擊綠色區(qū)域
因?yàn)榫G色區(qū)域是三個(gè)顏色區(qū)域最外層區(qū)域,其子元素的取消事件冒泡對(duì)自己沒(méi)有影響,再者其父元素沒(méi)有做任何事件監(jiān)聽(tīng),故輸出的值僅僅是其自身事件觸發(fā)得到。
3.綠色區(qū)域停止傳播
分別點(diǎn)擊綠色區(qū)域,藍(lán)色區(qū)域,紅色區(qū)域:
得到的效果和沒(méi)有做停止事件在DOM層中的傳播是一樣的,因?yàn)榫G色區(qū)域是三個(gè)顏色區(qū)域最外層區(qū)域,其做取消事件冒泡,其子元素的事件冒泡對(duì)此沒(méi)有影響,再者其父元素沒(méi)有做任何事件監(jiān)聽(tīng),故輸出的值和沒(méi)有做停止事件在DOM層中的傳播。
事件捕獲事件捕獲是不太具體的節(jié)點(diǎn)應(yīng)該更早接受到事件,而具體的節(jié)點(diǎn)應(yīng)該最后接受到事件。看看下面的圖:
如圖中,div元素增加一個(gè)click事件,在事件捕獲中,document對(duì)象首先接受到click事件,然后事件沿DOM樹(shù)依次向下,一直傳播到事件的實(shí)際目標(biāo),即div元素。看看下面的實(shí)例:
Document 外部盒innerbox3
這份代碼與冒泡事件的代碼大致相同,有變化的就是添加事件處理程序的操作addEventListener(),其中的第三個(gè)參數(shù)改為了true,表示在捕獲階段調(diào)用事件處理程序。
分別點(diǎn)擊綠色區(qū)域、藍(lán)色區(qū)域、紅色區(qū)域時(shí)執(zhí)行順序:
輸出的原因相信大家都很清楚了,在這就不再解釋了,需要注意的是控制臺(tái)值得輸出順序,和冒泡事件輸出順序相反的。
接下來(lái)再講講捕獲事件中停止事件在DOM層次中的傳播,取消進(jìn)一步的事件捕獲,這和冒泡事件的很不一樣,主要原因在于它們的傳播順序剛好相反,大家需要認(rèn)真的思考,不要搞混淆了,現(xiàn)在就講講其中的一種比較容易出錯(cuò)的,其它的大家可以自行思考,完整代碼已經(jīng)貼出來(lái)了,大家看看下面的實(shí)例:
藍(lán)色區(qū)域的click事件中添加了stopPropagation()方法,取消進(jìn)一步的事件捕獲,分別點(diǎn)擊不同區(qū)域,會(huì)產(chǎn)生什么效果呢???大家往下看:
點(diǎn)擊綠色區(qū)域
這個(gè)原因就不再解釋了,大家都懂!!!
點(diǎn)擊藍(lán)色區(qū)域
輸出的值有兩個(gè),這個(gè)大家容易搞錯(cuò),在藍(lán)色區(qū)域的click事件中添加了stopPropagation()方法,取消了事件捕獲,不應(yīng)該只出現(xiàn)“點(diǎn)擊了inner”的嗎,怎么還出現(xiàn)了“點(diǎn)擊了外部盒子”呢???這就又可能和事件冒泡搞混淆了,事件捕獲是由不太具體的節(jié)點(diǎn)應(yīng)該更早接受到事件,而具體的節(jié)點(diǎn)應(yīng)該最后接受到事件。簡(jiǎn)單點(diǎn)來(lái)說(shuō)是由外向內(nèi)傳播。藍(lán)色區(qū)域的click事件中添加了stopPropagation()方法,只是該節(jié)點(diǎn)不會(huì)再向下傳播,該節(jié)點(diǎn)的父元素還是會(huì)傳播到該節(jié)點(diǎn)的,所以輸出的值會(huì)有兩個(gè),而不是一個(gè)。
點(diǎn)擊紅色區(qū)域
輸出的值有兩個(gè),這個(gè)的原因和上面的差不多,思想是一樣的,藍(lán)色區(qū)域的click事件中添加了stopPropagation()方法,該節(jié)點(diǎn)不會(huì)再向下傳播,點(diǎn)擊紅色區(qū)域,捕獲事件只能做到藍(lán)色區(qū)域就停止了。
事件流“DOM2級(jí)事件”規(guī)定的事件流包括三個(gè)階段:事件捕獲階段、處于目標(biāo)階段、事件冒泡階段。首先發(fā)生的是事件捕獲階段,為截獲事件提供了機(jī)會(huì)。然后是實(shí)際的目標(biāo)接收事件。最后一個(gè)階段是冒泡階段,可以在這個(gè)階段對(duì)事件做出響應(yīng)。
在DOM事件流中,實(shí)際的目標(biāo)如div元素在捕獲階段不會(huì)接受到事件,這也就意味在捕獲階段,事件從document到html元素再到body后就停止了。下一階段是處于目標(biāo)階段,于是事件在div上發(fā)生,并在事件處理中被看成冒泡階段的一部分,然后,冒泡階段發(fā)生,事件有傳播會(huì)文檔。
分別點(diǎn)擊綠色區(qū)域、藍(lán)色區(qū)域、紅色區(qū)域
具體原因就在過(guò)多的去解釋了,這個(gè)就留給大家思考,清楚的的理解事件流機(jī)制就能很快的得出答案。
何處調(diào)用事件處理程序,何時(shí)在冒泡階段調(diào)用事件處理程序,何時(shí)在捕獲階段調(diào)用事件處理程序。
終于寫完了!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/51512.html
摘要:強(qiáng)制類型轉(zhuǎn)換本章介紹了的數(shù)據(jù)類型之間的轉(zhuǎn)換即強(qiáng)制類型轉(zhuǎn)換包括顯式和隱式。強(qiáng)制類型轉(zhuǎn)換常常為人詬病但實(shí)際上很多時(shí)候它們是非常有用的。隱式強(qiáng)制類型轉(zhuǎn)換則沒(méi)有那么明顯是其他操作的副作用。在處理強(qiáng)制類型轉(zhuǎn)換的時(shí)候要十分小心尤其是隱式強(qiáng)制類型轉(zhuǎn)換。 前言 《你不知道的 javascript》是一個(gè)前端學(xué)習(xí)必讀的系列,讓不求甚解的JavaScript開(kāi)發(fā)者迎難而上,深入語(yǔ)言內(nèi)部,弄清楚JavaSc...
摘要:異步請(qǐng)求線程在在連接后是通過(guò)瀏覽器新開(kāi)一個(gè)線程請(qǐng)求將檢測(cè)到狀態(tài)變更時(shí),如果設(shè)置有回調(diào)函數(shù),異步線程就產(chǎn)生狀態(tài)變更事件,將這個(gè)回調(diào)再放入事件循環(huán)隊(duì)列中。 基礎(chǔ):瀏覽器 -- 多進(jìn)程,每個(gè)tab頁(yè)獨(dú)立一個(gè)瀏覽器渲染進(jìn)程(瀏覽器內(nèi)核) 每個(gè)瀏覽器渲染進(jìn)程是多線程的,主要包括:GUI渲染線程 JS引擎線程 也稱為JS內(nèi)核,負(fù)責(zé)處理Javascript腳本程序。(例如V8引擎) JS引擎線程負(fù)...
摘要:前端增長(zhǎng)重新定義大前端精心打造全新課程,歡迎吐槽反饋寶貴意見(jiàn)在線課程前端增長(zhǎng)你不知道的那些細(xì)節(jié)附贈(zèng)常見(jiàn)核心前端面試問(wèn)題與詳細(xì)解答官方博客前端學(xué)堂課件腦圖下載課程介紹前端知識(shí)點(diǎn)很多,很細(xì)碎。 showImg(https://segmentfault.com/img/bVbu250?w=500&h=497);前端增長(zhǎng)-重新定義大前端 精心打造全新課程,歡迎吐槽!反饋寶貴意見(jiàn)! 在線課程:前...
摘要:前端增長(zhǎng)重新定義大前端精心打造全新課程,歡迎吐槽反饋寶貴意見(jiàn)在線課程前端增長(zhǎng)你不知道的那些細(xì)節(jié)附贈(zèng)常見(jiàn)核心前端面試問(wèn)題與詳細(xì)解答官方博客前端學(xué)堂課件腦圖下載課程介紹前端知識(shí)點(diǎn)很多,很細(xì)碎。 showImg(https://segmentfault.com/img/bVbu250?w=500&h=497);前端增長(zhǎng)-重新定義大前端 精心打造全新課程,歡迎吐槽!反饋寶貴意見(jiàn)! 在線課程:前...
摘要:前端增長(zhǎng)重新定義大前端精心打造全新課程,歡迎吐槽反饋寶貴意見(jiàn)在線課程前端增長(zhǎng)你不知道的那些細(xì)節(jié)附贈(zèng)常見(jiàn)核心前端面試問(wèn)題與詳細(xì)解答官方博客前端學(xué)堂課件腦圖下載課程介紹前端知識(shí)點(diǎn)很多,很細(xì)碎。 showImg(https://segmentfault.com/img/bVbu250?w=500&h=497);前端增長(zhǎng)-重新定義大前端 精心打造全新課程,歡迎吐槽!反饋寶貴意見(jiàn)! 在線課程:前...
閱讀 2978·2021-11-23 09:51
閱讀 3609·2021-10-13 09:39
閱讀 2493·2021-09-22 15:06
閱讀 881·2019-08-30 15:55
閱讀 3147·2019-08-30 15:44
閱讀 1778·2019-08-30 14:05
閱讀 3434·2019-08-29 15:24
閱讀 2362·2019-08-29 12:44