從onClick談事件代理和了解事件傳播機(jī)制

javasriptdelegate這個(gè)詞經(jīng)常出現(xiàn),看字面的意思,代理、委托。

要搞懂事件代理,我們先來看看什么是代理,相信我們生活中現(xiàn)在還有朋友在做微商的,而微商的產(chǎn)品就是一級(jí)一級(jí)代理,下家找上家拿貨這樣子,你賣了東西從上家拿貨,這個(gè)過程相當(dāng)于你也有了貨

我們?cè)趺磸淖置嫔蟻砹私馐录拇砟?慢慢來,我們先來看一個(gè)需求,有這樣一個(gè)列表,當(dāng)我們每次點(diǎn)擊的時(shí)候,就在控制臺(tái)打印列表里的內(nèi)容

作為一名新手,我經(jīng)常這樣綁定onclick事件

我會(huì)循環(huán)每一個(gè)li當(dāng)我點(diǎn)擊一個(gè)在控制臺(tái)顯示打印結(jié)果,全部綁定click事件,于是,我的代碼是這樣的

 <ul class="ct">
    <li>我是一號(hào)</li>
    <li>我是二號(hào)</li>
    <li>我是三號(hào)</li>
    <li>我是四號(hào)</li>
    <li>我是五號(hào)</li>
  </ul>
  <button type = "button" id="btn">增加</button>

var ul = document.querySelector(".ct")
for(var i=0;i<ul.children.length;i++){
  ul.children[i].onclick = function(){
    console.log(this.innerText)
  } 
}
代碼沒有問題

我覺得這樣寫的挺好的,可是有人說這樣會(huì)耗費(fèi)性能,那我就不管了,可是當(dāng)我改了一下需求,我發(fā)現(xiàn)這個(gè)代碼用的沒那么舒服了

我在代碼中通過js加入新的li,當(dāng)我點(diǎn)擊新的li時(shí),控制臺(tái)沒有打印我的代碼?怎么回事?

我加入了幾這樣的代碼

var btn =document.querySelector("#btn")
var i =6
btn.addEventListener("click",function(){
  var node = document.createElement("li")
  node.innerText = "我是" + i++ + "號(hào)"
  ul.appendChild(node)
})
后面增加的li沒有在控制臺(tái)打印

這是為什么?因?yàn)樵械膌i跟我后面生成的li根本不是同時(shí)發(fā)生的,在創(chuàng)建新的li元素之前,已經(jīng)給存在的li加事件了,好吧,那我怎么修改呢?難道要重新循環(huán)遍歷,太麻煩了,

有人告訴我可以用代理,代理是什么,看了文章,好吧,修改一下代碼

ul.addEventListener("click",function(e){
 // 檢查事件源e.targe是否為L(zhǎng)i
  if(e.target.nodeName.toLowerCase() == 'li'){
    console.log(e.target.innerText)
  }
})

成功了

新增新的點(diǎn)擊li也會(huì)再控制臺(tái)打印,解決了,于是耐心翻資料看了一下什么是事件代理:

定義:事件委托就是利用事件冒泡,只指定一個(gè)事件處理程序,就可以管理某一類型的所有事件。

那什么是冒泡呢?

  • 當(dāng)一個(gè)元素上的事件被觸發(fā)的時(shí)候,比如說鼠標(biāo)點(diǎn)擊了一個(gè)按鈕,同樣的事件將會(huì)在那個(gè)元素的所有祖先元素中被觸發(fā)。這一過程被稱為事件冒泡

回到我們本文的這個(gè)例子,看看改動(dòng)后的代碼,我把onlick事件綁定到了ul標(biāo)簽上面,而不是li標(biāo)簽。于是,當(dāng)我點(diǎn)擊任何一個(gè)li標(biāo)簽(不管是動(dòng)態(tài)生成的還是之前就有的)是,這個(gè)事件就開始冒泡,尋找父元素。由于我這里給ul綁定了onlick,那么這時(shí),ul會(huì)捕獲冒泡上來的onclick事件。

接著,如果,這個(gè)target剛剛好就是li標(biāo)if(target.nodeName.toLowerCase() == 'li'),那么執(zhí)行函數(shù)。

簡(jiǎn)單介紹一下事件傳播機(jī)制,主要介紹DOM2.0

  • DOM2.0模型將事件處理流程分為三個(gè)階段:一、事件捕獲階段,二、事件目標(biāo)階段,三、事件起泡階段。如圖:
事件傳播
  • 事件捕獲:當(dāng)某個(gè)元素觸發(fā)某個(gè)事件(如onclick),頂層對(duì)象document就會(huì)發(fā)出一個(gè)事件流,隨著DOM樹的節(jié)點(diǎn)向目標(biāo)元素節(jié)點(diǎn)流去,直到到達(dá)事件真正發(fā)生的目標(biāo)元素。在這個(gè)過程中,事件相應(yīng)的監(jiān)聽函數(shù)是不會(huì)被觸發(fā)的。

  • 事件目標(biāo):當(dāng)?shù)竭_(dá)目標(biāo)元素之后,執(zhí)行目標(biāo)元素該事件相應(yīng)的處理函數(shù)。如果沒有綁定監(jiān)聽函數(shù),那就不執(zhí)行。

  • 事件起泡:從目標(biāo)元素開始,往頂層元素傳播。途中如果有節(jié)點(diǎn)綁定了相應(yīng)的事件處理函數(shù),這些函數(shù)都會(huì)被一次觸發(fā)。如果想阻止事件起泡,可以使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)來組織事件的冒泡傳播。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,417評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評(píng)論 1 294
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,204評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評(píng)論 2 378

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

  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,626評(píng)論 2 10
  • 1.背景介紹 1.1什么是事件委托? 事件委托還有一個(gè)名字叫事件代理,JavaScript高級(jí)程序設(shè)計(jì)上講:事件委...
    我叫于搞吧閱讀 1,663評(píng)論 4 9
  • 不少新進(jìn)入職場(chǎng)或者轉(zhuǎn)崗的朋友這在進(jìn)入工作崗位不久都遇到幾個(gè)問題: 1、工作從勤雜開始:一般新人都是被重點(diǎn)“照顧的對(duì)...
    抱團(tuán)取暖閱讀 2,276評(píng)論 0 0
  • 01 感謝自“校園紅人”活動(dòng)推出以來,我們收到自全國(guó)各地高校樂觀,上進(jìn),積極進(jìn)取的同學(xué)們的報(bào)名申請(qǐng),場(chǎng)面確實(shí)壯觀。...
    俺來也紅人組閱讀 244評(píng)論 0 0
  • 一 男子幾乎夜夜都在做同一個(gè)夢(mèng)。 夢(mèng)見自己身處一個(gè)水簾洞中,有石桌、石凳,石桌正中放著一個(gè)亮燦燦的金剛?cè)Γ鸵慌_(tái)手...
    seven牛閱讀 744評(píng)論 4 5