zoukankan      html  css  js  c++  java
  • 事件委托

    什么是事件委托。

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

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

    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

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

  • 相关阅读:
    wcf布到服务器下载文件大小限制问题
    动态修改母版页中的DIV标签中的LI的A的CLASS属性
    c# 分页的方法
    Java学习笔记-异常处理-有风险的行为
    ASP.NET Core中的静态文件
    在ASP.NET Core中进行配置
    ASP.NET Core中的中间件和请求管道
    Kestrel:ASP.NET Core的Web服务器
    ASP.NET Core Program.cs
    ASP.Net Core Startup类
  • 原文地址:https://www.cnblogs.com/zhengzunzun/p/5796668.html
Copyright © 2011-2022 走看看