事件捕獲和冒泡

眾所周知(假裝是這樣的),在IE(支持冒泡)和NetScape(支持捕獲)兩者打完之后尼摹,W3C給了個(gè)折中的結(jié)果“先捕獲再冒泡,就這么定了”。

所以事件的觸發(fā)會(huì)經(jīng)歷三個(gè)階段:
  1. 事件捕獲階段(e.eventPhase==1)從document開(kāi)始石蔗,一層層往里面捕獲,遇到捕獲事件立即觸發(fā)執(zhí)行畅形;
  2. 處于目標(biāo)階段(e.eventPhase==2)到達(dá)事件位置养距,觸發(fā)事件;
  3. 事件冒泡階段(e.eventPhase==3)從事件位置一層層往外冒泡日熬,直到返回到document棍厌,遇到冒泡事件立即觸發(fā)執(zhí)行。

obj.addEventListener(“click”,func, true); //捕獲方式
obj.addEventListener(“click”,func, false);//冒泡方式

再來(lái)看下event.stopPropagation()到底是個(gè)什么鬼竖席。

說(shuō)是阻止冒泡耘纱,然而并不嚴(yán)謹(jǐn)昂~,因?yàn)樗恢皇亲柚姑芭荼霞觯€阻止事件的繼續(xù)捕獲束析,說(shuō)白了就是不讓事件繼續(xù)傳播了呢。當(dāng)然不傳播不代表當(dāng)前節(jié)點(diǎn)的其他事件也不執(zhí)行憎亚,如果想要接下來(lái)綁定在該節(jié)點(diǎn)的其他事件也阻止的話员寇,就要用event.stopImmediatePropagation()來(lái)阻止(這么多額,真是煩躁)第美。

還有更煩躁的蝶锋,捕獲和冒泡的順序是嚴(yán)格的,所以事件之間的執(zhí)行順序和事件注冊(cè)的順序是沒(méi)關(guān)系的什往。
但是牲览!如果一個(gè)節(jié)點(diǎn)既綁定了捕獲事件,又綁定了冒泡事件,并且都處于eventPhase==2 && e.target==e.currentTarget的階段第献,那么就和注冊(cè)順序保持一致贡必。這個(gè)時(shí)候就要看事件發(fā)生的位置和階段了,不要忽略不要忽略不要忽略庸毫,點(diǎn)擊一個(gè)div的時(shí)候最先進(jìn)行的處理是判斷e.targete.currentTarget是否相等仔拟。
比如我按照這樣的順序?qū)懥舜a:

<div id="p">
    parent
    <p id="c">child</p>
</div>
<script type="text/javascript">
window.alert = function(msg){
    console.log(msg);
}
p.addEventListener('click', function (e) {
    alert('父節(jié)點(diǎn)捕獲:' + e.eventPhase);
    alert('父節(jié)點(diǎn)捕獲:' + e.currentTarget);
    alert('父節(jié)點(diǎn)捕獲:' + (e.currentTarget == e.target));
    alert('父節(jié)點(diǎn)捕獲');
}, true);
p.addEventListener('click', function (e) {
    alert('父節(jié)點(diǎn)冒泡:' + e.eventPhase);
    alert('父節(jié)點(diǎn)冒泡:' + e.currentTarget);
    alert('父節(jié)點(diǎn)冒泡:' + (e.currentTarget == e.target));
    alert('父節(jié)點(diǎn)冒泡');
}, false);
c.addEventListener('click', function (e) {
    alert('子節(jié)點(diǎn)冒泡:' + e.eventPhase);
    alert('子節(jié)點(diǎn)冒泡:' + e.currentTarget);
    alert('子節(jié)點(diǎn)冒泡:' + (e.currentTarget == e.target));
    alert('子節(jié)點(diǎn)冒泡');
}, false);
c.addEventListener('click', function (e) {
    alert('子節(jié)點(diǎn)捕獲:' + e.eventPhase);
    alert('子節(jié)點(diǎn)捕獲:' + e.currentTarget);
    alert('子節(jié)點(diǎn)捕獲:' + (e.currentTarget == e.target));
    alert('子節(jié)點(diǎn)捕獲');
}, true);
</script>

我點(diǎn)擊child的時(shí)候,控制臺(tái)輸出的是什么呢飒赃。利花。。



所以點(diǎn)擊child的時(shí)候父元素不處于phase2载佳,所以父元素身上的事件就是最先捕獲炒事,最后冒泡。但對(duì)于child元素來(lái)說(shuō)蔫慧,event的currentTarget就是child本身挠乳,而我先注冊(cè)了冒泡后注冊(cè)的捕獲,所以child就得乖乖先冒泡后捕獲姑躲。睡扬。。
是不是覺(jué)得很暈的說(shuō)黍析。卖怜。。

further more 瀏覽器寶寶為我們提供了一個(gè)獲取節(jié)點(diǎn)事件數(shù)的方法(如論是什么方式的綁定阐枣,addEventListener也算马靠,onclick=‘func()’也算):getEventListeners(node),返回一個(gè)事件數(shù)組蔼两。


如果注冊(cè)事件類(lèi)型不一樣虑粥,返回不同數(shù)組:

比如這里有三個(gè)click事件和一個(gè)mousedown事件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宪哩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子第晰,更是在濱河造成了極大的恐慌锁孟,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茁瘦,死亡現(xiàn)場(chǎng)離奇詭異品抽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)甜熔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)圆恤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腔稀,你說(shuō)我怎么就攤上這事盆昙∮鹄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵淡喜,是天一觀的道長(zhǎng)秕磷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)炼团,這世上最難降的妖魔是什么澎嚣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮瘟芝,結(jié)果婚禮上易桃,老公的妹妹穿的比我還像新娘。我一直安慰自己锌俱,他們只是感情好晤郑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嚼鹉,像睡著了一般贩汉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锚赤,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天匹舞,我揣著相機(jī)與錄音,去河邊找鬼线脚。 笑死赐稽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浑侥。 我是一名探鬼主播姊舵,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寓落!你這毒婦竟也來(lái)了括丁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伶选,失蹤者是張志新(化名)和其女友劉穎史飞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體仰税,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡构资,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陨簇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吐绵。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出己单,到底是詐尸還是另有隱情唉窃,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布荷鼠,位于F島的核電站句携,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏允乐。R本人自食惡果不足惜矮嫉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牍疏。 院中可真熱鬧蠢笋,春花似錦、人聲如沸鳞陨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厦滤。三九已至援岩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掏导,已是汗流浹背享怀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趟咆,地道東北人添瓷。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像值纱,于是被迫代替她去往敵國(guó)和親鳞贷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 事件捕獲階段:事件從最上一級(jí)標(biāo)簽開(kāi)始往下查找虐唠,直到捕獲到事件目標(biāo)(target) ------事件傳...
    2dcc2b155e1e閱讀 225評(píng)論 0 0
  • JavaScript 事件捕獲和冒泡 規(guī)范 在最新的 DOM 規(guī)范中搀愧,事件的捕獲與冒泡是通過(guò) addEventLi...
    shianqi閱讀 454評(píng)論 0 0
  • 一、事件捕獲:事件傳遞的順序 (父級(jí)到子級(jí))二疆偿、事件冒泡:事件處理的順序 (默認(rèn):子級(jí)到父級(jí))三咱筛、取消冒泡 就...
    大大的小小小心愿閱讀 130評(píng)論 0 0
  • 背景知識(shí) 什么是事件?直觀的說(shuō)就是網(wǎng)頁(yè)上發(fā)生的事情翁脆,大部分是指用戶(hù)的鼠標(biāo)動(dòng)作和鍵盤(pán)動(dòng)作,如點(diǎn)擊鼻种、移動(dòng)鼠標(biāo)反番、按下某個(gè)...
    吧啦啦小湯圓閱讀 1,852評(píng)論 2 15
  • 萌 即當(dāng)你看到一件讓你感到可愛(ài)到不行的人、事枫疆、物時(shí)爵川,皆可用此字形容之。 生活工作的壓力和學(xué)習(xí)時(shí)的迷孟⑿ǎ總是會(huì)把人壓得...
    嘮叨的663閱讀 207評(píng)論 0 0