Kwin Huang

不会搞艺术的程序员不是好设计师.

事件委托代理

2019-09-22

事件委托是什么

事件:通俗的讲, 就是onclick, onmouseenter, onmouseover, onmouseout... 等等

委托:通俗的讲, 就是让别人来做

那么事件委托就是:这个事件本来是加在某些元素上的, 然而你却加到别人身上来做, 来完成这个事件, 也就是利用冒泡原理, 把事件加到父级上, 触发执行结果

事件委托就是利用事件冒泡机制指定一个事件处理程序,来管理某一类型的所有事件。

事件委托的好处

  1. 提高性能(只在内存中开辟了一块空间,节省资源同时减少了dom操作)
  2. 新添加的元素还会有之前的事件

我们来看一个例子: 需要触发每个 li 来改变他们的背景颜色

<ul id="ul">
  <li>111</li>
  <li>222</li>
  <li>333</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上面添加鼠标事件。

但是如果说我们可能有很多个li用for循环的话就比较影响性能。


下面我们可以用事件委托的方式来实现这样的效果。html不变

window.onload = function(){
  var oUl = document.getElementById("ul");
  var aLi = oUl.getElementsByTagName("li");

  /*
  这里要用到事件源:event 对象,事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。
  ie:window.event.srcElement
  标准下:event.target
  nodeName:找到元素的标签名
  */
  oUl.onmouseover = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    //alert(target.innerHTML);
    if(target.nodeName.toLowerCase() == "li"){
    target.style.background = "red";
    }
  }
  oUl.onmouseout = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    //alert(target.innerHTML);
    if(target.nodeName.toLowerCase() == "li"){
    target.style.background = "";
    }
  }
}