JavaScript之事件委托實(shí)例(附原生js和jQuery代碼)
事件委托的原理依賴于事件冒泡,可以通過給父元素的事件委托來確定是哪個子元素觸發(fā)了事件從而做一系列操作。
使用事件委托的優(yōu)點(diǎn)
1、操作子元素時不用一一遍歷,可以根據(jù)事件觸發(fā)的對象而進(jìn)行相應(yīng)操作
dom結(jié)構(gòu)如下:
<ul id = "oUl"> <li class = "item"></li> <li class = "item"></li> <li class = "item"></li> <li class = "item"></li> <li class = "item"></li> </ul>
當(dāng)li被點(diǎn)擊時,打印該li的值。
在我們還沒有學(xué)事件委托的時候我們會遍歷所有l(wèi)i并給它們添加一個click事件,比如這樣:
var aLi = document.getElementsByTagName('li');
for(var i = 0; i < aLi.length; i++) // 遍歷li
aLi[i].addEventListener('click', function() { //給每個li添加事件
console.log(this.innerHTML);
});
學(xué)了事件委托之后js原生代碼如下:
var oUl = document.getElementById('oUl');
oUl.addEventListener('click', function(ev) {
ev = ev||window.event;
var tag = ev.target; // 觸發(fā)事件的對象保存在事件的target里面
console.log(tag.innerHTML);
})
jQuery代碼如下:
$('#oUl').on('click', '.item', function() {
console.log($(this).html()); // this指向oUl中觸發(fā)了click事件并且class為item的子元素
})
相比之下,事件委托只需要獲取父元素并且不需要遍歷li,效率提高了不少。
2、將事件委托給父元素后,動態(tài)創(chuàng)建(刪除)的子元素不用重新綁定(解綁)事件,實(shí)現(xiàn)了元素與事件的同步更新
在以往的js事件監(jiān)聽中,用js動態(tài)創(chuàng)建的子元素是沒有事件的,必須重新為它們綁定事件,但是用事件委托就不用這么麻煩了,不需要重新綁定事件依舊可以實(shí)現(xiàn)事件監(jiān)聽。
當(dāng)然事件綁定也是有弊端的,因為它依賴于事件冒泡,如果不支持冒泡那么就不能實(shí)現(xiàn)事件綁定了,不過我認(rèn)為這種幾率還是不高的。還有就是會發(fā)生事件誤判,比如頁面中的button1和button2的作用是點(diǎn)擊時彈出值,而button3的作用是點(diǎn)擊是頁面變色,這三個button的同一個事件實(shí)現(xiàn)功能不同,當(dāng)你將click事件委托給它們共同的父元素那么就會出現(xiàn)事件誤判。
所以我認(rèn)為事件委托是發(fā)生在一個子集合的事件功能相同的情況下,如果不相同則不要使用事件委托,以免弄巧成拙。
在實(shí)際開發(fā)中,掌握事件綁定對于代碼的規(guī)范性以及效率會有一定提高,總的來說利大于弊。
以上這篇JavaScript之事件委托實(shí)例(附原生js和jQuery代碼)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JS使用正則表達(dá)式除去字符串中重復(fù)字符的方法
這篇文章主要介紹了JS使用正則表達(dá)式除去字符串中重復(fù)字符的方法,以一個簡單實(shí)例分析了JavaScript中正則過濾的相關(guān)使用技巧,需要的朋友可以參考下2015-11-11
javascript在firefox下設(shè)為首頁的代碼
javascript在firefox下設(shè)為首頁的代碼...2007-09-09
bootstrap+jQuery實(shí)現(xiàn)的動態(tài)進(jìn)度條功能示例
這篇文章主要介紹了bootstrap+jQuery實(shí)現(xiàn)的動態(tài)進(jìn)度條功能,結(jié)合完整實(shí)例形式分析了bootstrap+jQuery實(shí)現(xiàn)動態(tài)進(jìn)度條的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
JavaScript自執(zhí)行函數(shù)和jQuery擴(kuò)展方法詳解
這篇文章主要為大家詳細(xì)介紹了JavaScript自執(zhí)行函數(shù)和jQuery擴(kuò)展方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
Js中將Long轉(zhuǎn)換成日期格式的實(shí)現(xiàn)方法
這篇文章主要介紹了Js中將Long轉(zhuǎn)換成日期格式的實(shí)現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06
CKEditor擴(kuò)展插件:自動排版功能autoformat插件實(shí)現(xiàn)方法詳解
這篇文章主要介紹了CKEditor擴(kuò)展插件:自動排版功能autoformat插件實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了CKEditor擴(kuò)展插件實(shí)現(xiàn)自動排版功能的autoformat插件具體定義、配置與使用技巧,需要的朋友可以參考下2020-02-02
JavaScript實(shí)現(xiàn)常用二級省市級聯(lián)下拉列表的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)常用二級省市級聯(lián)下拉列表的方法,實(shí)例分析了javascript實(shí)現(xiàn)級聯(lián)下拉列表的技巧與相關(guān)的元素操作方法,需要的朋友可以參考下2015-03-03

