摘要:先說事件流的事件流分為個(gè)階段捕獲目標(biāo)冒泡。如果是每個(gè)都去多帶帶綁定事件明顯不科學(xué),畢竟去拿列表也是畢竟消耗性能的,同時(shí)每個(gè)事件綁定的回調(diào)函數(shù)也會(huì)占用大量的內(nèi)存。那如果有動(dòng)態(tài)插入的元素呢于是委托就可以用上了。
先說事件流
js的事件流分為3個(gè)階段:捕獲、目標(biāo)、冒泡。即事件來了,先從上到下傳播(捕獲),到達(dá)目標(biāo)節(jié)點(diǎn)(目標(biāo)),然后在往上傳播(冒泡)。看下圖:
我們可以在綁定事件的時(shí)候指定指是在哪個(gè)階段觸發(fā)事件,element.addEventListener(event, function, useCapture),useCapture默認(rèn)為false,即默認(rèn)在冒泡階段觸發(fā)事件,來做個(gè)測(cè)試:
demo長這樣:
html:
wraper
- li1
- li2
- li3 span
js:
document.getElementById("wraper").addEventListener("click",function(e){ console.log("wraper") },false) document.getElementById("li3").addEventListener("click",function(e){ console.log("li3") },false) document.getElementsByTagName("span")[0].addEventListener("click",function(){ console.log("span") },false)
可以看到,這里全是在冒泡階段觸發(fā)事件,因此結(jié)果為:span li3 wraper 這樣的順序(從下到上),以此類推,如果全部設(shè)置為捕獲階段觸發(fā)事件呢?順序肯定就反過來了,繼續(xù)看下面:
document.getElementById("wraper").addEventListener("click",function(e){ console.log("wraper") },true) document.getElementById("li3").addEventListener("click",function(e){ console.log("li3") },true) document.getElementsByTagName("span")[0].addEventListener("click",function(){ console.log("span") },true)
結(jié)果為:wraper li3 span
同時(shí)還可以測(cè)試,某一個(gè)事件在捕獲階段是優(yōu)先觸發(fā)于冒泡階段的:
document.getElementById("wraper").addEventListener("click",function(e){ console.log("wraper") },false) document.getElementById("li3").addEventListener("click",function(e){ console.log("li3") },true) document.getElementsByTagName("span")[0].addEventListener("click",function(){ console.log("span") },false)
結(jié)果為:li3 span wraper
從需求出發(fā)來了這樣一個(gè)需求:在上面的demo中,要給ul下的每個(gè)li綁定一個(gè)事件,在點(diǎn)擊之后觸發(fā)。
如果是每個(gè)li都去多帶帶綁定事件?明顯不科學(xué),畢竟去拿li列表也是畢竟消耗性能的,同時(shí)每個(gè)事件綁定的回調(diào)函數(shù)也會(huì)占用大量的內(nèi)存。
你可能會(huì)說,我的元素不多,上面的消耗無所謂。那如果有動(dòng)態(tài)插入的元素呢?
于是委托就可以用上了。
document.getElementById("wraper").addEventListener("click", function (e) { var target = e.target if (target.nodeName.toLocaleLowerCase() === "li") { console.log(target.innerHTML); } });
這里的e.target指的時(shí)候鼠標(biāo)最后點(diǎn)擊的元素。在這個(gè)demo中,點(diǎn)擊深紅色的span,e.target就指的是span,如果點(diǎn)擊li3且不在紅色的span中,那么e.target指li3。
有一個(gè)問題就是如果匹配的元素需要更具體一些,比如class為li-test的某個(gè)li,就需要做優(yōu)化處理了。后面專門來一篇文章講。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/51929.html
摘要:先說事件流的事件流分為個(gè)階段捕獲目標(biāo)冒泡。如果是每個(gè)都去單獨(dú)綁定事件明顯不科學(xué),畢竟去拿列表也是畢竟消耗性能的,同時(shí)每個(gè)事件綁定的回調(diào)函數(shù)也會(huì)占用大量的內(nèi)存。那如果有動(dòng)態(tài)插入的元素呢于是委托就可以用上了。 先說事件流 js的事件流分為3個(gè)階段:捕獲、目標(biāo)、冒泡。即事件來了,先從上到下傳播(捕獲),到達(dá)目標(biāo)節(jié)點(diǎn)(目標(biāo)),然后在往上傳播(冒泡)。看下圖: showImg(https://s...
摘要:只觸發(fā)事件解除事件任然會(huì)執(zhí)行自定義事件把多個(gè)事件組合起來,或者在特定條件下觸發(fā)事件,普通的事件綁定是無法滿足需要的,可以通過自定義事件來形成組合。 jQuery 事件用法詳解 簡(jiǎn)介 jquery 之所以成為最受歡迎的前端庫,很大一部分是得益于它的事件具有良好的語義,優(yōu)秀的兼容性,并且便于管理和擴(kuò)展。 在這里我會(huì)介紹 jquery 事件的一些比較基礎(chǔ)的用法。 實(shí)現(xiàn)原理 jquery 事件...
摘要:查閱了一些資料之后才知道原來這就是事件冒泡,下面是我對(duì)事件冒泡和事件捕獲的理解。本文參考文章之事件冒泡詳解事件委托及其原理 前段時(shí)間開發(fā)一個(gè)小項(xiàng)目的時(shí)候遇到一個(gè)問題,即給一個(gè)元素以及它的父元素綁定了click事件,這個(gè)時(shí)候我點(diǎn)擊這個(gè)元素時(shí),父級(jí)元素的clik事件也會(huì)觸發(fā),這顯然不符合要求。查閱了一些資料之后才知道原來這就是事件冒泡,下面是我對(duì)事件冒泡和事件捕獲的理解。 事件冒泡:事件從...
摘要:查閱了一些資料之后才知道原來這就是事件冒泡,下面是我對(duì)事件冒泡和事件捕獲的理解。本文參考文章之事件冒泡詳解事件委托及其原理 前段時(shí)間開發(fā)一個(gè)小項(xiàng)目的時(shí)候遇到一個(gè)問題,即給一個(gè)元素以及它的父元素綁定了click事件,這個(gè)時(shí)候我點(diǎn)擊這個(gè)元素時(shí),父級(jí)元素的clik事件也會(huì)觸發(fā),這顯然不符合要求。查閱了一些資料之后才知道原來這就是事件冒泡,下面是我對(duì)事件冒泡和事件捕獲的理解。 事件冒泡:事件從...
閱讀 4095·2023-04-26 01:48
閱讀 3267·2021-10-13 09:40
閱讀 1746·2021-09-26 09:55
閱讀 3633·2021-08-12 13:23
閱讀 1791·2021-07-25 21:37
閱讀 3436·2019-08-30 15:53
閱讀 1399·2019-08-29 14:16
閱讀 1400·2019-08-29 12:59