js事件委托

  • 定義:通俗的講,事件就是onclick,onmouseoveronmouseout等就是事件,委托呢,就是讓別人來(lái)做,這個(gè)事件本來(lái)是加在某些元素上的,然而你卻加到別人身上來(lái)做,完成這個(gè)事件。
  • 原理:利用冒泡的原理,把事件加到父級(jí)上,觸發(fā)執(zhí)行效果。
  • 好處:1. 減少dom的遍歷與dom操作,提高性能。2. 動(dòng)態(tài)新添加的元素還會(huì)有之前的事件。
示例:鼠標(biāo)放置到li上后改變當(dāng)前l(fā)i背景色
html:
<ul id="ul">
  <li>aaaaaaaa</li>
  <li>bbbbbbbb</li>
  <li>cccccccc</li>
</ul>
不用事件委托:
window.onload = function(){
  var oUl = document.getElementById("ul");
  var aLi = oUl.getElementsByTagName("li");

  for(var i=0; i<aLi.length; i++){
    aLi[i].onmouseover = function(){
      this.style.background = "red";
    }
    aLi[i].onmouseout = function(){
      this.style.background = "";
    }
  }
}

利用遍歷就可以做到li上面添加鼠標(biāo)事件。
但是如果說(shuō)我們可能有很多個(gè)li用for循環(huán)的話就比較影響性能。

使用事件委托:
window.onload = function(){
  var oUl = document.getElementById("ul");
  var aLi = oUl.getElementsByTagName("li");

/*
這里要用到事件源
*/
  oUl.onmouseover = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    if(target.nodeName.toLowerCase() == "li"){
    target.style.background = "red";
    }
  }
  oUl.onmouseout = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    if(target.nodeName.toLowerCase() == "li"){
    target.style.background = "";
    }
  }
}

這樣,當(dāng)鼠標(biāo)在li上時(shí),根據(jù)事件冒泡,由當(dāng)前節(jié)點(diǎn)(當(dāng)前l(fā)i節(jié)點(diǎn)觸發(fā)了ul的mouseover事件)自下而上觸發(fā)事件,當(dāng)節(jié)點(diǎn)對(duì)象是li時(shí)執(zhí)行我們的操作。避免了dom遍歷。
??此外,和事先遍歷dom為每個(gè)li綁定事件不同,事件委托的方式是將事件綁定在ul上,所以在運(yùn)行時(shí)動(dòng)態(tài)添加的li上仍有效果。


術(shù)語(yǔ)解釋:

  • 事件對(duì)象: 如上代碼,當(dāng)onmousemove事件發(fā)生時(shí),就會(huì)產(chǎn)生一個(gè)事件對(duì)象,就是程序中的event對(duì)象
  • 獲取事件對(duì)象var e = event || window.event;IE下是window.event,標(biāo)準(zhǔn)下是event
  • 事件源:事件源,在事件中,當(dāng)前操作的那個(gè)元素就是事件源。
  • 獲取事件源:IE:window.event.srcElement ,標(biāo)準(zhǔn):event.target
  • target.nodeName:找到元素的標(biāo)簽名

*筆記整理自博客園

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一直以來(lái),對(duì)js的一些概念還是不清晰的,很多都沒有搞明白,今天無(wú)意間在群里見他們提起事件委托,所以查找了一些資料,...
    蝴蝶結(jié)199007閱讀 325評(píng)論 1 3
  • 轉(zhuǎn)載自 http://www.cnblogs.com/liugang-vip/p/5616484.html 一、概...
    涅磐廣廣閱讀 551評(píng)論 0 8
  • (續(xù)jQuery基礎(chǔ)(1)) 第5章 DOM節(jié)點(diǎn)的復(fù)制與替換 (1)DOM拷貝clone() 克隆節(jié)點(diǎn)是DOM的常...
    凜0_0閱讀 1,511評(píng)論 0 8
  • 我們收取快遞有兩種方法:一是在特定的地點(diǎn)等快遞的到來(lái),二是委托人代收。現(xiàn)實(shí)當(dāng)中,我們大都采用委托的方案。而委托人接...
    饑人谷_oathy閱讀 807評(píng)論 0 2
  • 碎雨寒煙繞晚亭, 輕花弄水動(dòng)浮鱗。 憑欄欲眺千山去, 笑看佳人忘早春。
    安城的真金閱讀 499評(píng)論 4 3

友情鏈接更多精彩內(nèi)容