JavaScript比較零碎的幾個點 - 事件模型.

事件在web開發(fā)中太常見了耿导。
web瀏覽器在主線程主隊列任務執(zhí)行完成之后声怔。
基本就進入到了到了eventLoop等待事件驅動的環(huán)節(jié)了。

1. 事件模型

W3C 標準定義了兩種事件模型.

  • 事件捕獲
  • 事件冒泡

除了 IE9 以及以下版本,現在主流的瀏覽器都支持這兩種事件模型.

事件捕獲:

在由嵌套層次(非視覺上)的元素結構里.
當有事件發(fā)生時,事件總是被最外層的元素捕獲到,并依次往內部傳遞.
傳遞方向是:從外到內.

<div class="parent">
    <div class="child"></div>
</div>
let parent = document.querySelector('.parent'),
      child = document.querySelector('.child')

  parent.addEventListener('click', function () {
    console.log('parent event capture')  
  }, true)

  child.addEventListener('click', function () {
    console.log('child event capture')
  }, true)

結果:

parent event capture
child event capture

事件冒泡

在包含有嵌套關系層級結構的元素里.
當有事件發(fā)生時,事件總是先被點擊的那個元素獲取到.
然后依次往外傳遞.
事件傳遞方向:從內到外.

<div class="parent">
    <div class="child"></div>
</div>
 parent.addEventListener('click', function () {
    console.log('parent event bubble')
  }, false)
  child.addEventListener('click', function () {
    console.log('child event bubble')
  }, false)

結果:

child event bubble
parent event bubble

自己提問一:如果同一個元素同時綁定事件冒泡和事件捕獲兩種方式呢?

先綁定事件冒泡,在綁定事件捕獲.

let bubble_capture = document.querySelector('.bubble-capture')
  bubble_capture.addEventListener('click', function () {
    console.log('事件冒泡')
  }, false)
  
bubble_capture.addEventListener('click', function () {
    console.log('事件捕獲')
  }, true)

執(zhí)行結果:

事件冒泡
事件捕獲

先綁定事件捕獲,在綁定事件冒泡.

bubble_capture.addEventListener('click', function () {
    console.log('事件捕獲')
  }, true)

  bubble_capture.addEventListener('click', function () {
    console.log('事件冒泡')
  }, false)

執(zhí)行結果:

事件捕獲
事件冒泡

先執(zhí)行事件捕獲,在執(zhí)行事件冒泡.

結論:

單個元素同時綁定兩種事件模型.先綁定的模型先執(zhí)行,后綁定的模型后執(zhí)行.


自己提問二:如果帶有嵌套關系的多個元素同時綁定事件冒泡和事件捕獲兩種方式呢?

WEB頁面中,有三個嵌套的DIV元素.

<div class="parent">
    <div class="child">
      <div class="box"></div>
    </div>
  </div>
三個有嵌套關系的DIV
let parent = document.querySelector('.parent'),
      child = document.querySelector('.child'),
      box = document.querySelector('.box')

  // 事件捕獲.
  parent.addEventListener('click', function () {
    console.log('parent event capture')  
  }, true)

  child.addEventListener('click', function () {
    console.log('child event capture')
  }, true)

  box.addEventListener('click', function () {
    console.log('box event capture')
  }, true)


  // 事件冒泡
  parent.addEventListener('click', function () {
    console.log('parent event bubble')
  }, false)

  child.addEventListener('click', function () {
    console.log('child event bubble')
  }, false)

  box.addEventListener('click', function () {
    console.log('box event bubble')
  }, false)

點擊最里面的藍色的DIV.(box)

輸出結果:

parent event capture
child event capture
box event capture
box event bubble
child event bubble
parent event bubble

打亂事件模型綁定代碼:

box.addEventListener('click', function () {
    console.log('box event bubble')
  }, false)
  parent.addEventListener('click', function () {
    console.log('parent event capture')  
  }, true)
  box.addEventListener('click', function () {
    console.log('box event capture')
  }, true)
  child.addEventListener('click', function () {
    console.log('child event bubble')
  }, false)
  parent.addEventListener('click', function () {
    console.log('parent event bubble')
  }, false)
  child.addEventListener('click', function () {
    console.log('child event capture')
  }, true)

輸出結果:

parent event capture
child event capture
box event bubble
box event capture
child event bubble
parent event bubble

結論:

當多個嵌套關系的元素同時綁定了事件冒泡和事件捕獲兩種事件模型時.
除了觸發(fā)事件的那個元素(這里是最內部的藍色DIV)執(zhí)行順序和模型綁定順序一致意外.
其他外層的元素事件模型執(zhí)行順序永遠都是 事件捕獲 優(yōu)先于 事件冒泡 執(zhí)行.

所以,在某種程度上,我們可以理解為:事件捕獲 優(yōu)先于 事件冒泡 執(zhí)行.

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末舱呻,一起剝皮案震驚了整個濱河市醋火,隨后出現的幾起案子悠汽,更是在濱河造成了極大的恐慌,老刑警劉巖芥驳,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柿冲,死亡現場離奇詭異,居然都是意外死亡兆旬,警方通過查閱死者的電腦和手機假抄,發(fā)現死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丽猬,“玉大人宿饱,你說我怎么就攤上這事〗潘睿” “怎么了谬以?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長由桌。 經常有香客問我为黎,道長,這世上最難降的妖魔是什么行您? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任铭乾,我火速辦了婚禮,結果婚禮上娃循,老公的妹妹穿的比我還像新娘炕檩。我一直安慰自己,他們只是感情好淮野,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布捧书。 她就那樣靜靜地躺著吹泡,像睡著了一般骤星。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爆哑,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天洞难,我揣著相機與錄音,去河邊找鬼揭朝。 笑死队贱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的潭袱。 我是一名探鬼主播柱嫌,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屯换!你這毒婦竟也來了编丘?” 一聲冷哼從身側響起与学,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘉抓,沒想到半個月后索守,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡抑片,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年卵佛,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敞斋。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡截汪,死狀恐怖,靈堂內的尸體忽然破棺而出渺尘,到底是詐尸還是另有隱情挫鸽,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布鸥跟,位于F島的核電站丢郊,受9級特大地震影響,放射性物質發(fā)生泄漏医咨。R本人自食惡果不足惜枫匾,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拟淮。 院中可真熱鬧干茉,春花似錦、人聲如沸很泊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽委造。三九已至戳鹅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昏兆,已是汗流浹背枫虏。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爬虱,地道東北人隶债。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像跑筝,于是被迫代替她去往敵國和親死讹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5曲梗? 答:HTML5是最新的HTML標準赞警。 注意:講述HT...
    kismetajun閱讀 27,518評論 1 45
  • js之事件機制 1逛腿、事件初探 1.1 js事件的概述 JavaScript事件:JavaScript是基于事件驅動...
    道無虛閱讀 2,374評論 1 3
  • ??JavaScript 與 HTML 之間的交互是通過事件實現的单默。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,502評論 1 11
  • 在所有現代瀏覽器當中——除了IE9之前的版本——都實現了DOM2標準事件模型忘瓦,這個事件模型規(guī)定搁廓,每一個DOM元素所...
    泡杯感冒靈閱讀 498評論 0 0
  • 以下文章為轉載,對理解JavaScript中的事件處理機制很有幫助耕皮,淺顯易懂境蜕,特分享于此。 什么是事件凌停? 事件(E...
    jxyjxy閱讀 3,042評論 1 10