成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

你不知道的javascript事件

imtianx / 2868人閱讀

摘要:然而和分別提出了完全相反的的概念事件冒泡和事件捕獲。所有的節(jié)點(diǎn)中包含了這兩個(gè)方法,它們都接受個(gè)參數(shù)要處理的事件名作為事件處理程序的函數(shù)和一個(gè)布爾值。事件流級事件規(guī)定的事件流包括三個(gè)階段事件捕獲階段處于目標(biāo)階段事件冒泡階段。

事件流描述的是從頁面中接受事件的順序。然而ie和netscape分別提出了完全相反的的概念:事件冒泡和事件捕獲。下面就說說這兩種事件流:

事件冒泡

事件冒泡,就是說時(shí)間開始時(shí)由具體的元素接受,然后逐級向上傳播到較為不具體的節(jié)點(diǎn)??纯聪旅娴膱D就比較清楚了:

比如說在圖中的

元素中添加一個(gè)click事件,那么這個(gè)
元素就是我們的單擊事件,然后click事件就會(huì)沿DOM樹向上傳播,在每一級節(jié)點(diǎn)上都會(huì)發(fā)生,直到傳播到document對象。看看下面的實(shí)例:

在理解實(shí)例事前先說說實(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ì)說到事件捕獲),布爾值默認(rèn)參數(shù)是false。




    
    
    
    Document
    


    
外部盒
inner
box3

瀏覽器效果:

現(xiàn)在就說說實(shí)例中觸發(fā)事件的執(zhí)行順序,挺有意思的,容易被繞進(jìn)去:

點(diǎn)擊綠色區(qū)域

輸出的值也就是一個(gè)了。

點(diǎn)擊藍(lán)色區(qū)域

輸出的值有兩個(gè),這個(gè)為什么呢,原因很簡單,藍(lán)色區(qū)域是在綠色區(qū)域內(nèi),藍(lán)色區(qū)域觸發(fā)click事件,在冒泡階段調(diào)用事件處理程序,點(diǎn)擊藍(lán)色區(qū)域,click事件沿DOM樹向上傳播,由類屬性為inner的元素的向上傳播到類屬性為box的元素,再依次向上傳播,故輸出的值為兩個(gè)。注意其輸出的順序:先輸出自身元素觸發(fā)事件中的值,然后再是父元素事件中的值。由內(nèi)向外,這也就是事件冒泡的核心內(nèi)容了。

點(diǎn)擊紅色區(qū)域

輸出的值有三個(gè),原因就不再解釋了,原因和上面的一樣,同時(shí)也要注意下它們的輸出順序。通過這個(gè)實(shí)例對事件冒泡有了解了,接下來我們來深入下:

在我們實(shí)際開發(fā)中,是很不愿意事件在DOM層次中的傳播,很影響體驗(yàn)效果,如上實(shí)例,觸發(fā)紅色區(qū)域的元素,我只想輸出一個(gè)值,然而偏偏輸出了三個(gè)值,是不是很煩?????這個(gè)還是有解決方案的,stopPropagation()方法用于立即停止事件在DOM層次中的傳播,即取消進(jìn)一步的事件冒泡或捕獲??聪旅娴睦樱╤tml代碼與上面實(shí)例一樣):

紅色區(qū)域停止傳播

  

先說說上面的代碼中涉及到的一個(gè)局部變量event,相信很多人對這個(gè)變量都不是很理解,我剛接觸的時(shí)候也不是很理解這個(gè)變量,為什么會(huì)有這個(gè)變量,這個(gè)變量干嘛用的,怎么還可以調(diào)用方法和屬性,好神奇?。。?!現(xiàn)在我就來說說這個(gè)局部變量,這個(gè)變量就是事件對象,在觸發(fā)DOM上的某個(gè)事件時(shí),會(huì)產(chǎn)生一個(gè)事件對象event,這個(gè)對象中包含了所有與事件有關(guān)的信息,包括了導(dǎo)致事件的元素、事件的類型以及其它與特定事件相關(guān)的信息。例如,鼠標(biāo)操作導(dǎo)致的事件對象中,會(huì)包含鼠標(biāo)位置的信息。

點(diǎn)擊紅色區(qū)域:

在紅色區(qū)域的click事件中加了stopPropagation(),這就立即停止了事件在DOM層次中的傳播,也就是取消進(jìn)一步的事件冒泡,輸出的值也就只有一個(gè)了。

分別點(diǎn)擊藍(lán)色區(qū)域、綠色區(qū)域:

從輸出可以看出,這兩部分沒有加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ū)域,其子元素的取消事件冒泡對自己沒有影響,再者其父元素沒有做任何事件監(jiān)聽,故輸出的值僅僅是其自身事件觸發(fā)得到。

3.綠色區(qū)域停止傳播
 

分別點(diǎn)擊綠色區(qū)域,藍(lán)色區(qū)域,紅色區(qū)域:

得到的效果和沒有做停止事件在DOM層中的傳播是一樣的,因?yàn)榫G色區(qū)域是三個(gè)顏色區(qū)域最外層區(qū)域,其做取消事件冒泡,其子元素的事件冒泡對此沒有影響,再者其父元素沒有做任何事件監(jiān)聽,故輸出的值和沒有做停止事件在DOM層中的傳播。

事件捕獲

事件捕獲是不太具體的節(jié)點(diǎn)應(yīng)該更早接受到事件,而具體的節(jié)點(diǎn)應(yīng)該最后接受到事件??纯聪旅娴膱D:

如圖中,div元素增加一個(gè)click事件,在事件捕獲中,document對象首先接受到click事件,然后事件沿DOM樹依次向下,一直傳播到事件的實(shí)際目標(biāo),即div元素??纯聪旅娴膶?shí)例:




    
    
    
    Document
    


    
外部盒
inner
box3

這份代碼與冒泡事件的代碼大致相同,有變化的就是添加事件處理程序的操作addEventListener(),其中的第三個(gè)參數(shù)改為了true,表示在捕獲階段調(diào)用事件處理程序。

分別點(diǎn)擊綠色區(qū)域、藍(lán)色區(qū)域、紅色區(qū)域時(shí)執(zhí)行順序:

輸出的原因相信大家都很清楚了,在這就不再解釋了,需要注意的是控制臺值得輸出順序,和冒泡事件輸出順序相反的。

接下來再講講捕獲事件中停止事件在DOM層次中的傳播,取消進(jìn)一步的事件捕獲,這和冒泡事件的很不一樣,主要原因在于它們的傳播順序剛好相反,大家需要認(rèn)真的思考,不要搞混淆了,現(xiàn)在就講講其中的一種比較容易出錯(cuò)的,其它的大家可以自行思考,完整代碼已經(jīng)貼出來了,大家看看下面的實(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)該最后接受到事件。簡單點(diǎn)來說是由外向內(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級事件”規(guī)定的事件流包括三個(gè)階段:事件捕獲階段、處于目標(biāo)階段、事件冒泡階段。首先發(fā)生的是事件捕獲階段,為截獲事件提供了機(jī)會(huì)。然后是實(shí)際的目標(biāo)接收事件。最后一個(gè)階段是冒泡階段,可以在這個(gè)階段對事件做出響應(yīng)。

在DOM事件流中,實(shí)際的目標(biāo)如div元素在捕獲階段不會(huì)接受到事件,這也就意味在捕獲階段,事件從document到html元素再到body后就停止了。下一階段是處于目標(biāo)階段,于是事件在div上發(fā)生,并在事件處理中被看成冒泡階段的一部分,然后,冒泡階段發(fā)生,事件有傳播會(huì)文檔。

分別點(diǎn)擊綠色區(qū)域、藍(lán)色區(qū)域、紅色區(qū)域

具體原因就在過多的去解釋了,這個(gè)就留給大家思考,清楚的的理解事件流機(jī)制就能很快的得出答案。
何處調(diào)用事件處理程序,何時(shí)在冒泡階段調(diào)用事件處理程序,何時(shí)在捕獲階段調(diào)用事件處理程序。

結(jié)束

終于寫完了!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89847.html

相關(guān)文章

  • 精讀《你不知道javascript(中卷)》

    摘要:強(qiáng)制類型轉(zhuǎn)換本章介紹了的數(shù)據(jù)類型之間的轉(zhuǎn)換即強(qiáng)制類型轉(zhuǎn)換包括顯式和隱式。強(qiáng)制類型轉(zhuǎn)換常常為人詬病但實(shí)際上很多時(shí)候它們是非常有用的。隱式強(qiáng)制類型轉(zhuǎn)換則沒有那么明顯是其他操作的副作用。在處理強(qiáng)制類型轉(zhuǎn)換的時(shí)候要十分小心尤其是隱式強(qiáng)制類型轉(zhuǎn)換。 前言 《你不知道的 javascript》是一個(gè)前端學(xué)習(xí)必讀的系列,讓不求甚解的JavaScript開發(fā)者迎難而上,深入語言內(nèi)部,弄清楚JavaSc...

    李世贊 評論0 收藏0
  • 【筆記】 你不知道JS讀書筆記——異步

    摘要:異步請求線程在在連接后是通過瀏覽器新開一個(gè)線程請求將檢測到狀態(tài)變更時(shí),如果設(shè)置有回調(diào)函數(shù),異步線程就產(chǎn)生狀態(tài)變更事件,將這個(gè)回調(diào)再放入事件循環(huán)隊(duì)列中。 基礎(chǔ):瀏覽器 -- 多進(jìn)程,每個(gè)tab頁獨(dú)立一個(gè)瀏覽器渲染進(jìn)程(瀏覽器內(nèi)核) 每個(gè)瀏覽器渲染進(jìn)程是多線程的,主要包括:GUI渲染線程 JS引擎線程 也稱為JS內(nèi)核,負(fù)責(zé)處理Javascript腳本程序。(例如V8引擎) JS引擎線程負(fù)...

    junnplus 評論0 收藏0
  • 前端增長-你不知道那些細(xì)節(jié)

    摘要:前端增長重新定義大前端精心打造全新課程,歡迎吐槽反饋寶貴意見在線課程前端增長你不知道的那些細(xì)節(jié)附贈(zèng)常見核心前端面試問題與詳細(xì)解答官方博客前端學(xué)堂課件腦圖下載課程介紹前端知識點(diǎn)很多,很細(xì)碎。 showImg(https://segmentfault.com/img/bVbu250?w=500&h=497);前端增長-重新定義大前端 精心打造全新課程,歡迎吐槽!反饋寶貴意見! 在線課程:前...

    asce1885 評論0 收藏0
  • 前端增長-你不知道那些細(xì)節(jié)

    摘要:前端增長重新定義大前端精心打造全新課程,歡迎吐槽反饋寶貴意見在線課程前端增長你不知道的那些細(xì)節(jié)附贈(zèng)常見核心前端面試問題與詳細(xì)解答官方博客前端學(xué)堂課件腦圖下載課程介紹前端知識點(diǎn)很多,很細(xì)碎。 showImg(https://segmentfault.com/img/bVbu250?w=500&h=497);前端增長-重新定義大前端 精心打造全新課程,歡迎吐槽!反饋寶貴意見! 在線課程:前...

    Lyux 評論0 收藏0
  • 前端增長-你不知道那些細(xì)節(jié)

    摘要:前端增長重新定義大前端精心打造全新課程,歡迎吐槽反饋寶貴意見在線課程前端增長你不知道的那些細(xì)節(jié)附贈(zèng)常見核心前端面試問題與詳細(xì)解答官方博客前端學(xué)堂課件腦圖下載課程介紹前端知識點(diǎn)很多,很細(xì)碎。 showImg(https://segmentfault.com/img/bVbu250?w=500&h=497);前端增長-重新定義大前端 精心打造全新課程,歡迎吐槽!反饋寶貴意見! 在線課程:前...

    baishancloud 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<