事件委托

什么是事件委托。

事件委托是把自己该做的事情交给父级或者父级的父级,让他们代替你做这件事。

生活中也会有这样的例子,比如:在公司中有三个人会收到快递,现在又两种处理办法

1.三个人都下来接受快递,每个人都签收拿走

2.委托给前台小妹,让他代为签收,然后再根据快递上不同的人的姓名分别给他们。

同样在DOM操作中,利用冒泡的原理,把事件加到父级的身上,达到同样的效果。

现在有一个需求,让一堆li的背景色变成红色。点击li变色

js代码:

for(var i=0;i<aLi.length;i++){

  aLi[i].onclick=function(){

     this.style.background='red';

  };

}

这样写没有问题,但是如果页面里面有很多li的时候,会影响页面的加载速度,影响性能。

时间委托就很好的解决了这个问题,它会提高性能。提高网页的加载速度,这是他的第一个优点。

js代码

window.onload=function(){

  var oUl=document.getElementById('ul');

  var aLI=oUl.children;

  oUl.onclick=function(ev){

    var oEvent=ev||event;

    var oTarget=oEvent.srcElemet||oEvent.target;

    if(oUl.tagName=='LI'){

      oTarget.style.background='red';

    }

  };

};

这里我们需要用到事件源 即事件的源头,要操作的元素就是事件得源头

oEvent.srcElement 不兼容ff 

oEvent.target  IE8报undefined

tagName 找到要改变的标签名

除了可以提升性能外,事件委托还有另外一个优点,可以给未来的元素添加事件。

有一个输入框,一个按钮。当点击按钮的时候,在底下可以添加留言

html代码

<input type="text" id="text">

<input type="button" id="btn" value="按钮">

<ul id="ul">

  <li>111</li>

  <li>222</li>

</ul>

不用事件委托时的js代码:

window.onload=function(){

  var oBtn=document.getElementById("btn");

  var oTxt=document.getElementById("text");

  var oUl=document.getElementById("ul");

  var aLi=oUl.getElementsByTagname("li");

  for(var i=0;i<aLi.length;i++){

    aLi[i].onclick=function(){

      alert(this.innerHTML);

    };

  }

  oBtn.onclick=function(){

    var oLi=createElement("li");

    oLi.innerHTML=oTxt.value;

    oUl.appendChild(oLi);

  };

};

不用事件委托时,弹出的innerHTML只是已有的li的内容。而新创建的li的内容是取不到的,因为for循环已经执行完毕。

用时间委托是的js代码

oBtn.onclick=function(){

    var oLi=createElement("li");

    oLi.innerHTML=oTxt.value;

    oUl.appendChild(oLi);

};

oUl.onclick=function(ev){

  oEvent=ev||event;

  oTarget=oEvent.srcElement||oEvent.target;

  if(oTarget.tagName=='LI'){

    alert(0Target.innerHTML);

  }

};

事件委托以后,可以轻而易举的拿到每一个li的innerHTML

据此可以知道事件委托可以给未来的元素添加事件。

原文地址:https://www.cnblogs.com/zhengzunzun/p/5796668.html