16_事件冒泡和捕獲的執(zhí)行順序了解嗎?什么是事件委托

一凭戴、事件冒泡和捕獲

運行條件:當一個事件發(fā)生在具有父元素的的元素上時佩抹,現(xiàn)代瀏覽器根據(jù)事件添加時的設置來執(zhí)行(冒泡或者捕獲)

通過 addEventListener() 的第三個屬性來設置事件是通過捕獲階段注冊的(true),還是冒泡階段注冊的(false)帖世。默認情況下是false休蟹。

1、事件冒泡

從實際操作的元素(事件)向上級父元素一級一級執(zhí)行下去,直到達到<html>

有些時候父元素和子元素都定義了click事件赂弓,但是不希望點擊子元素的時候執(zhí)行父元素的click事件(例如dialog彈窗的遮罩層如果是父元素绑榴,而dialog彈窗內(nèi)容層是子元素,同時可以通過點擊遮罩層來關閉彈窗盈魁,但是點擊內(nèi)容層不關閉彈窗)翔怎,可以通過stopPropagation()在子元素上阻止冒泡。

2备埃、事件捕獲(一般不會用到)

瀏覽器檢查元素的最外層祖先<html>姓惑,是否在捕獲階段中注冊了一個onclick事件處理程序,如果是按脚,則運行它于毙。
然后,它移動到<html>中的下一個元素(點擊的元素的父元素)辅搬,并執(zhí)行相同的操作唯沮,然后是下一個元素(點擊的元素的父元素),依此類推堪遂,直到到達實際點擊的元素介蛉。

二、事件捕獲和冒泡的區(qū)別(執(zhí)行順序的不同)

// css
#div1 {
    width: 400px;
    height: 400px;
    background: #f00;
}
#div2 {
    width: 300px;
    height: 300px;
    background: #0f0;
}
#div3 {
    width: 200px;
    height: 200px;
    background: #00f;
}
#div4 {
    width: 100px;
    height: 100px;
    background: #f0f;
}

// html
<div id="div1">我是div1
<div id="div2">我是div2
<div id="div3">我是div3
<div id="div4">我是div4</div>
</div>
</div>
</div>
</body>

// javascript
var div1=document.getElementById("div1");
var div2=document.getElementById("div2");
var div3=document.getElementById("div3");
var div4=document.getElementById("div4");

div1.addEventListener("click",function(){
    alert("我是div1");
})

div2.addEventListener("click",function(){
    alert("我是div2");
})

div3.addEventListener("click",function(){
    alert("我是div3");
})

div4.addEventListener("click",function(){
    alert("我是div4");
})

冒泡的執(zhí)行順序:當我們點擊div1的時候溶褪,只彈出“我是div1”币旧,但是當我們點擊div2的時候,就先彈出“我是div2”猿妈,再彈出“我是div1”吹菱,當我們點擊div4 的時候,則是4-3-2-1這樣的順序彭则,這樣就叫做冒泡鳍刷,它就像魚兒吐泡泡一樣,從下到上俯抖,泡泡從水下上來泡泡會變得越來越大输瓜,從這個角度思考,先從子元素開始執(zhí)行芬萍,然后是父元素尤揣,再然后是祖先元素,他們的等級也是越來越大的担忧。在addEventListener里芹缔,false是默認的,表示的是冒泡瓶盛。

捕獲的執(zhí)行順序:在addEventListener里最欠,第三個參數(shù)設置為true示罗,表示的是捕獲。將上面的代碼中添加進第三個參數(shù)true芝硬,再運行代碼蚜点,會發(fā)現(xiàn)這時,當我們點擊div4的時候拌阴,出現(xiàn)的順序是1-2-3-4绍绘,它是從祖先元素開始慢慢找,最后找到我們的點擊目標迟赃,可以將這個行為理解為就像警察叔叔抓壞人一樣陪拘,逐漸的縮小抓捕范圍,最后確定到某一個人身上纤壁,所以這個過程叫做捕獲左刽。

dom元素中,既有冒泡酌媒,又有捕獲的執(zhí)行順序:w3c規(guī)定欠痴,任何發(fā)生在w3c事件模型中的事件,首是進入捕獲階段秒咨,直到達到目標元素喇辽,再進入冒泡階段。示例:

div1.addEventListener("click",function(){
    alert("div1");
}, false);
div2.addEventListener("click",function(){
    alert("div2");
}, true);
div3.addEventListener("click",function(){
    alert("div3");
}, false);
div4.addEventListener("click",function(){
    alert("div4");
}, true);

這時的div1和div3是冒泡事件雨席,div2和div4是捕獲事件菩咨,當我們點擊div4以后,彈出的順序是2-4-3-1陡厘。因為我們先執(zhí)行捕獲過程旦委,在這個例子中div2和div4是捕獲的,那么捕獲又是從大到小雏亚,所以,先彈出div2摩钙,再彈出div4罢低,捕獲結束以后就該是冒泡了。冒泡的順序是從小到大胖笛,從子到父网持,所以就先彈出div3,再就是div1长踊,所以最后的順序是2-4-3-1功舀。如果我們點擊div3,結果會是2-3-1身弊,同樣的道理辟汰,先捕獲列敲,捕獲是從div1開始到div3,這中間只有div2是捕獲帖汞,div4并沒有執(zhí)行到戴而,因為我們點擊的目標是div3,后面的步驟和前面的過程一樣翩蘸,先3后1所意。

最后一個問題,代碼示例:

div1.addEventListener("click",function(){
    alert("div1");
}, false);
div2.addEventListener("click",function(){
    alert("div2_捕獲");
}, true);
div2.addEventListener("click",function(){
    alert("div2_冒泡");
}, false);

那么催首,當我們點擊div2的時候扶踊,結果是 div2_捕獲 -> div_2冒泡 -> div1的順序,代碼修改:

div1.addEventListener("click",function(){
    alert("div1");
}, false);
div2.addEventListener("click",function(){
    alert("div2_冒泡");
}, false);
div2.addEventListener("click",function(){
    alert("div2_捕獲");
}, true);

這時當我們點擊div2的時候郎任,結果是 div2_冒泡 -> div_2捕獲 -> div1的順序

綜上結論:綁定在被點擊元素的事件是按照代碼的順序發(fā)生的秧耗,其他非綁定的元素則是通過冒泡或者捕獲的觸發(fā)。按照W3C的標準涝滴,先發(fā)生捕獲事件绣版,后發(fā)生冒泡事件。

事件的整體順序是:非目標元素捕獲 -> 目標元素代碼順序 -> 非目標元素冒泡歼疮。

三杂抽、事件委托

1、使用場景

如果你想要在大量子元素(包括動態(tài)添加的)中單擊任何一個就可以運行一段代碼韩脏,這個時候可以把事件監(jiān)聽器設置在父節(jié)點上缩麸。

2、好處

  • 只在內(nèi)存中開辟了一塊空間赡矢,節(jié)省資源同時減少了dom操作杭朱,提高性能
  • 對于新添加的元素也會有之前的事件

3、事件委托同捕獲和冒泡的關系

  • 事件捕獲和冒泡是現(xiàn)代瀏覽器的執(zhí)行事件的兩個不同階段
  • 事件委托是利用冒泡階段的運行機制來實現(xiàn)的

4吹散、實例:ul中觸發(fā)每個li來改變他們的背景顏色

// html
<ul id='ul'>
    <li>111111</li>
    <li>222222</li>
    <li>333333</li>
</ul>
<button id='button'>添加元素</button>


// javascript
window.onload = function() {
      let oUl = document.getElementById('ul');
      let aLi = oUl.getElementsByTagName('li');
      let but = document.getElementById('button');
      let now = 3;

      // 事件源:event對象弧械,不管在哪個事件中,只要你操作的哪個元素就是事件源
      // ie:window.event.srcElement
      // 標準:event.target
      oUl.onmouseover = function(e){
        let ev = e || window.event;
        let target = ev.target || ev.srcElement;
        if(target.nodeName.toLowerCase() == 'li'){
          target.style.background = 'red';
        }
      }

      oUl.onmouseout = function(e){
        let ev = e || window.event;
        let target = ev.target || ev.srcElement;
        if(target.nodeName.toLowerCase() == 'li'){
          target.style.background = '';
        }
      }

      but.onclick = function(){
        now ++;
        let newLi = document.createElement('li');
        newLi.innerHTML = 111111 * now;
        oUl.appendChild(newLi);
      }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空民,一起剝皮案震驚了整個濱河市刃唐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌界轩,老刑警劉巖画饥,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浊猾,居然都是意外死亡抖甘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門葫慎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衔彻,“玉大人薇宠,你說我怎么就攤上這事∶准椋” “怎么了昼接?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長悴晰。 經(jīng)常有香客問我慢睡,道長,這世上最難降的妖魔是什么铡溪? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任漂辐,我火速辦了婚禮,結果婚禮上棕硫,老公的妹妹穿的比我還像新娘髓涯。我一直安慰自己,他們只是感情好哈扮,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布纬纪。 她就那樣靜靜地躺著,像睡著了一般滑肉。 火紅的嫁衣襯著肌膚如雪包各。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天靶庙,我揣著相機與錄音问畅,去河邊找鬼。 笑死六荒,一個胖子當著我的面吹牛护姆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掏击,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼卵皂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砚亭?” 一聲冷哼從身側響起渐裂,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钠惩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體族阅,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡篓跛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坦刀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愧沟。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔬咬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沐寺,到底是詐尸還是另有隱情林艘,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布混坞,位于F島的核電站狐援,受9級特大地震影響,放射性物質發(fā)生泄漏究孕。R本人自食惡果不足惜啥酱,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厨诸。 院中可真熱鬧镶殷,春花似錦、人聲如沸微酬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颗管。三九已至陷遮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忙上,已是汗流浹背拷呆。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疫粥,地道東北人茬斧。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像梗逮,于是被迫代替她去往敵國和親项秉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348