JS事件 事件流

一:什么是事件流呢?

通俗的來說轴咱,可以想象畫在一張紙上的一組同心圓汛蝙。如果你把手指放在圓心上烈涮,那么你的手指指向的不是一個(gè)圓,而是紙上的所有圓窖剑。兩家公司的瀏覽器開發(fā)團(tuán)隊(duì)在看待瀏覽器事件方面還是一致的坚洽。如果你單擊了某個(gè)按鈕,他們都認(rèn)為單擊事件不僅僅發(fā)生在按鈕上西土。換句話說讶舰,在單擊按鈕的同時(shí),你也單擊了按鈕的容器元素需了,甚至也單擊了整個(gè)頁面跳昼。

事件流描述的是從頁面中接收事件的順序。但有意思的是肋乍,IE 和Netscape 開發(fā)團(tuán)隊(duì)居然提出了差不多是完全相反的事件流的概念鹅颊。IE 的事件流是事件冒泡流,而Netscape Communicator 的事件流是事件捕獲流墓造。


二:事件冒泡

IE 的事件流叫做事件冒泡(event bubbling)堪伍,即事件開始時(shí)由最具體的元素(文檔中嵌套層次最深的那個(gè)節(jié)點(diǎn))接收,然后逐級向上傳播到較為不具體的節(jié)點(diǎn)(文檔)觅闽。

以下面的HTML 頁面為例:


如果你單擊了頁面中的btn元素杠娱,那么這個(gè)click 事件會按照如下順序傳播:

1:div

2:body

3:html

4:document

也就是說,click 事件首先在div元素上發(fā)生谱煤,而這個(gè)元素就是我們單擊的元素摊求。然后,click事件沿DOM樹向上傳播刘离,在每一級節(jié)點(diǎn)上都會發(fā)生室叉,直至傳播到document 對象。如圖 展示了事件冒泡的過程硫惕。


所有現(xiàn)代瀏覽器都支持事件冒泡茧痕,但在具體實(shí)現(xiàn)上還是有一些差別。IE5.5 及更早版本中的事件冒泡會跳過元素(從直接跳到document)。IE9璃谨、Firefox贩挣、Chrome 和Safari 則將事件一直冒泡到window 對象。

三:事件捕獲

Netscape Communicator 團(tuán)隊(duì)提出的另一種事件流叫做事件捕獲(event capturing)令野。事件捕獲的思想是不太具體的節(jié)點(diǎn)應(yīng)該更早接收到事件,而最具體的節(jié)點(diǎn)應(yīng)該最后接收到事件徽级。事件捕獲的用意在于在事件到達(dá)預(yù)定目標(biāo)之前捕獲它气破。如果仍以前面的HTML 頁面作為演示事件捕獲的例子,那么單擊元素就會以下列順序觸發(fā)click 事件餐抢。

如果你單擊了頁面中的div元素现使,那么這個(gè)click 事件會按照如下順序傳播:


1:document

2:html

3:body

4:div

在事件捕獲過程中低匙,document 對象首先接收到click 事件,然后事件沿DOM 樹依次向下碳锈,一直傳播到事件的實(shí)際目標(biāo)顽冶,即元素。如圖展示了事件捕獲的過程售碳。


雖然事件捕獲是Netscape Communicator 唯一支持的事件流模型渗稍,但I(xiàn)E9、Safari团滥、Chrome竿屹、Opera和Firefox 目前也都支持這種事件流模型。盡管“DOM2 級事件”規(guī)范要求事件應(yīng)該從document 對象開始傳播灸姊,但這些瀏覽器都是從window 對象開始捕獲事件的拱燃。由于老版本的瀏覽器不支持,因此很少有人使用事件捕獲力惯。我們也建議讀者放心地使用事件冒泡碗誉,在有特殊需要時(shí)再使用事件捕獲。

四:DOM事件流

“DOM2級事件”規(guī)定的事件流包括三個(gè)階段:事件捕獲階段父晶、處于目標(biāo)階段和事件冒泡階段哮缺。首先發(fā)生的是事件捕獲,為截獲事件提供了機(jī)會甲喝。然后是實(shí)際的目標(biāo)接收到事件尝苇。最后一個(gè)階段是冒泡階段,可以在這個(gè)階段對事件做出響應(yīng)埠胖。以前面簡單的HTML 頁面為例糠溜,單擊元素會按照如圖所示順序觸發(fā)事件。

在DOM 事件流中直撤,實(shí)際的目標(biāo)(元素)在捕獲階段不會接收到事件非竿。這意味著在捕獲階段,事件從document 到再到后就停止了谋竖。

多數(shù)支持DOM 事件流的瀏覽器都實(shí)現(xiàn)了一種特定的行為红柱;即使“DOM2 級事件”規(guī)范明確要求捕獲階段不會涉及事件目標(biāo),但I(xiàn)E9蓖乘、Safari锤悄、Chrome、Firefox 和Opera 9.5 及更高版本都會在捕獲階段觸發(fā)事件對象上的事件驱敲。結(jié)果铁蹈,就是有兩個(gè)機(jī)會在目標(biāo)對象上面操作事件宽闲。

IE9众眨、Opera握牧、Firefox、Chrome 和Safari 都支持DOM 事件流娩梨;IE8 及更早版本不支持DOM 事件流沿腰。

來源于:JavaScript高級程序設(shè)計(jì)第三版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狈定,隨后出現(xiàn)的幾起案子颂龙,更是在濱河造成了極大的恐慌,老刑警劉巖纽什,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件措嵌,死亡現(xiàn)場離奇詭異,居然都是意外死亡芦缰,警方通過查閱死者的電腦和手機(jī)企巢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來让蕾,“玉大人浪规,你說我怎么就攤上這事√叫ⅲ” “怎么了笋婿?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顿颅。 經(jīng)常有香客問我缸濒,道長,這世上最難降的妖魔是什么粱腻? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任绍填,我火速辦了婚禮,結(jié)果婚禮上栖疑,老公的妹妹穿的比我還像新娘讨永。我一直安慰自己,他們只是感情好遇革,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布卿闹。 她就那樣靜靜地躺著,像睡著了一般萝快。 火紅的嫁衣襯著肌膚如雪锻霎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天揪漩,我揣著相機(jī)與錄音旋恼,去河邊找鬼。 笑死奄容,一個(gè)胖子當(dāng)著我的面吹牛冰更,可吹牛的內(nèi)容都是我干的产徊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蜀细,長吁一口氣:“原來是場噩夢啊……” “哼舟铜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奠衔,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤谆刨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后归斤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痊夭,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年脏里,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了生兆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膝宁,死狀恐怖鸦难,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情员淫,我是刑警寧澤合蔽,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站介返,受9級特大地震影響拴事,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圣蝎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一刃宵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徘公,春花似錦牲证、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至等太,卻和暖如春捂齐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缩抡。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工奠宜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓压真,卻偏偏與公主長得像娩嚼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子榴都,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 事件 js組成:ECMA語法嘴高,規(guī)定了js的基本規(guī)則,類似于使用var定義變量和屎,使用for來規(guī)定循環(huán)拴驮。BOM:瀏覽器...
    DecadeHeart閱讀 1,236評論 0 1
  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型。在這種程序設(shè)計(jì)風(fēng)格下柴信,當(dāng)文檔套啤、瀏覽器、元素或與之相關(guān)的對象發(fā)...
    劼哥stone閱讀 1,250評論 3 11
  • 以下文章為轉(zhuǎn)載随常,對理解JavaScript中的事件處理機(jī)制很有幫助潜沦,淺顯易懂,特分享于此绪氛。 什么是事件唆鸡? 事件(E...
    jxyjxy閱讀 3,023評論 1 10
  • 聲明:本文來源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 6,950評論 1 6
  • 圖片發(fā)自簡書App 1 遇見自己喜歡的人究竟是什么感受? 小鹿今天終于知道了枣察。當(dāng)他第一眼看見安老師的時(shí)候争占,他認(rèn)為自...
    白鶴清閱讀 731評論 3 13