JS事件流

問(wèn)題引入

首先看一個(gè)相關(guān)問(wèn)題秋度,點(diǎn)擊span元素,輸出什么?

<div id="yeyeELe">    
    爺爺在此    
    <p id="parEle">        
        我是父元素        
        <span id="sonEle">我是子元素</span>    
    </p>
</div>
var sonEle = document.getElementById('sonEle');
var parEle = document.getElementById('parEle');
var yeyeELe = document.getElementById('yeyeELe');

yeyeELe.addEventListener('click', function () {
    console.log('爺爺 冒泡');
}, false);
sonEle.addEventListener('click', function () {
    console.log('子級(jí) 捕獲');
}, true);
parEle.addEventListener('click', function () {
    console.log('父級(jí) 捕獲');
}, true);
yeyeELe.addEventListener('click', function () {
    console.log('爺爺 捕獲');
}, true);
parEle.addEventListener('click', function () {
    console.log('父級(jí) 冒泡');
}, false);
sonEle.addEventListener('click', function () {
    console.log('子級(jí) 冒泡');
}, false);

想搞清楚最終的輸出順序翠勉,就不得不從事件流說(shuō)起妖啥。

事件流

事件流需要從事件講起。

JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的对碌。

事件就是文檔或者瀏覽器窗口中發(fā)生的一些特定的交互瞬間荆虱。可以使用偵聽器(或處理程序)來(lái)預(yù)訂事件朽们,以便事件發(fā)生時(shí)執(zhí)行相應(yīng)代碼怀读。

而事件流描述的是從頁(yè)面接收事件的順序。

有意思的是华坦,當(dāng)時(shí)不同的開發(fā)團(tuán)隊(duì)對(duì)于事件流提出了完全相反的概念愿吹,主要分為IE事件流——冒泡不从,Netscape Communicator事件流——捕獲惜姐。

1. 事件冒泡

IE的事件流叫做事件冒泡,即時(shí)間最開始由最具體的元素接收椿息,然后逐級(jí)向上傳播到較為不具體的節(jié)點(diǎn)(文檔)歹袁。

例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件流</title>
</head>
<body>
    <div id="ele">Click Me</div>
</body>
</html>

當(dāng)你點(diǎn)擊了頁(yè)面中的 div 元素,那么這個(gè) click 事件的傳播順序如下:

  1. div
  2. body
  3. html
  4. document

也就是說(shuō)寝优,click 事件首先在元素 div 上發(fā)生条舔,然后 click 事件沿 DOM 樹向上傳播,每一級(jí)的節(jié)點(diǎn)上都會(huì)發(fā)生乏矾,直至傳播到 document 對(duì)象孟抗。如下圖:

事件冒泡

2. 事件捕獲

Netscape Communicator 團(tuán)隊(duì)提出的事件流則為事件捕獲,事件捕獲的思想是不太具體的節(jié)點(diǎn)更早的收到事件钻心,而最具體的節(jié)點(diǎn)最后接收到事件凄硼。

事件捕獲的用意在于事件達(dá)到預(yù)定目標(biāo)之前捕獲它。

1. 中所述案例捷沸,則單擊 div 元素后摊沉,事件觸發(fā)順序如下:

  1. document
  2. html
  3. body
  4. div

也就是在事件捕獲過(guò)程中,document 對(duì)象首先接收到 click 事件痒给,然后事件沿 DOM 樹向下依次傳播说墨,直到傳播事件的實(shí)際目標(biāo),即 div 元素苍柏。過(guò)程如圖:

事件捕獲

提示

雖然事件捕獲是 Netscape Communicator 唯一支持的事件流模型尼斧,但是 IE9、Safari试吁、Chrome突颊、Opera 和 Firefox 等目前也都支持這種事件流模型。由于版本兼容性問(wèn)題,事件捕獲還是較少使用律秃。當(dāng)然爬橡,建議依然是 放心使用事件冒泡,在有特殊需要時(shí)再使用事件捕獲棒动。

3. DOM 事件流

“DOM2級(jí)事件”規(guī)定的事件流包括三個(gè)階段:

  1. 事件捕獲階段
  2. 處于目標(biāo)階段
  3. 事件冒泡階段

首先發(fā)生的是事件捕獲糙申,為截獲事件提供了機(jī)會(huì),然后實(shí)際目標(biāo)接收到事件船惨,最后階段是冒泡階段柜裸,此階段可以對(duì)事件作出響應(yīng)。

還以上述代碼為例粱锐,單擊 div 元素后的觸發(fā)順序則是:

DOM事件流

在 DOM 事件流中疙挺,實(shí)際目標(biāo)(div)在捕獲階段不會(huì)接收到事件,意味著在捕獲階段事件從 document 到 html 再到 body 就會(huì)停止怜浅。下一階段是處于目標(biāo)階段铐然,于是事件在 div 上發(fā)生,并在事件處理中被看成冒泡的一部分恶座。最后搀暑,冒泡階段發(fā)生,事件傳播回文檔跨琳。

回顧問(wèn)題

開篇提出的問(wèn)題自点,仿佛在此可以得出結(jié)論:

輸出結(jié)果

可是,當(dāng)我們將子級(jí)的冒泡和捕獲在js中位置調(diào)換后脉让,輸出的則是……子級(jí)先冒泡桂敛,再捕獲!如下:

輸出結(jié)果2

這是什么原因呢溅潜?术唬?

下期——事件處理順序,進(jìn)一步揭曉伟恶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碴开,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子博秫,更是在濱河造成了極大的恐慌潦牛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挡育,死亡現(xiàn)場(chǎng)離奇詭異巴碗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)即寒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門橡淆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)召噩,“玉大人,你說(shuō)我怎么就攤上這事逸爵【叩危” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵师倔,是天一觀的道長(zhǎng)构韵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)趋艘,這世上最難降的妖魔是什么疲恢? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮瓷胧,結(jié)果婚禮上显拳,老公的妹妹穿的比我還像新娘。我一直安慰自己搓萧,他們只是感情好杂数,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矛绘,像睡著了一般耍休。 火紅的嫁衣襯著肌膚如雪刃永。 梳的紋絲不亂的頭發(fā)上货矮,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音斯够,去河邊找鬼囚玫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛读规,可吹牛的內(nèi)容都是我干的抓督。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼束亏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铃在!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碍遍,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤定铜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后怕敬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揣炕,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年东跪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了畸陡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹰溜。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖丁恭,靈堂內(nèi)的尸體忽然破棺而出曹动,到底是詐尸還是另有隱情,我是刑警寧澤牲览,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布仁期,位于F島的核電站,受9級(jí)特大地震影響竭恬,放射性物質(zhì)發(fā)生泄漏跛蛋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一痊硕、第九天 我趴在偏房一處隱蔽的房頂上張望赊级。 院中可真熱鬧,春花似錦岔绸、人聲如沸理逊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晋被。三九已至,卻和暖如春刚盈,著一層夾襖步出監(jiān)牢的瞬間羡洛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工藕漱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欲侮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓肋联,卻偏偏與公主長(zhǎng)得像威蕉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橄仍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 一:事件冒泡和事件代理事件:事件是文檔和瀏覽器窗口中發(fā)生特定交互的瞬間韧涨,當(dāng)我們與瀏覽器中的web頁(yè)面進(jìn)行某些類型交...
    悠哈121閱讀 6,495評(píng)論 0 0
  • 事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬間侮繁。 DOM3級(jí)事件虑粥,規(guī)定了以下幾類事件*UI事件:當(dāng)用戶與頁(yè)面...
    Miss____Du閱讀 1,481評(píng)論 0 8
  • js的事件流模型 事件捕抓:是一種以從上至下的的方式進(jìn)行傳播。以click事件為例鼎天,它會(huì)從最外層的根節(jié)點(diǎn)到達(dá)點(diǎn)擊的...
    達(dá)文西_Huong閱讀 348評(píng)論 0 0
  • 事件流 Click Me 冒泡型事件:事件按照從最特定的事件目標(biāo)到最不特定的事件目標(biāo)的順序觸發(fā)舀奶。觸發(fā)的順序是:di...
    醋留香閱讀 789評(píng)論 0 1
  • 一、基本概念 1. 事件:文檔或?yàn)g覽器窗口中發(fā)生特定交互瞬間 2. 事件流:描述從瀏覽器中接收事件的順序 (1) ...
    三文治z閱讀 359評(píng)論 0 0