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

    1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。

    也就是:利用冒泡的原理,把事件加到父级上,触发执行效果。

    好处呢:1,提高性能。

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

    1 <ul id="ul">
    2   <li>aaaaaaaa</li>
    3   <li>bbbbbbbb</li>
    4   <li>cccccccc</li>
    5 </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不变

     1 window.onload = function(){
     2   var oUl = document.getElementById("ul");
     3   var aLi = oUl.getElementsByTagName("li");
     4 
     5 /*
     6 这里要用到事件源:event 对象,事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。
     7 ie:window.event.srcElement
     8 标准下:event.target
     9 nodeName:找到元素的标签名
    10 */
    11   oUl.onmouseover = function(ev){
    12     var ev = ev || window.event;
    13     var target = ev.target || ev.srcElement;
    14     //alert(target.innerHTML);
    15     if(target.nodeName.toLowerCase() == "li"){
    16     target.style.background = "red";
    17     }
    18   }
    19   oUl.onmouseout = function(ev){
    20     var ev = ev || window.event;
    21     var target = ev.target || ev.srcElement;
    22     //alert(target.innerHTML);
    23     if(target.nodeName.toLowerCase() == "li"){
    24     target.style.background = "";
    25     }
    26   }
    27 }

    好处2,新添加的元素还会有之前的事件。

    我们还拿这个例子看,但是我们要做动态的添加li。点击button动态添加li

    如:

    <input type="button" id="btn" />
    <ul id="ul">
      <li>aaaaaaaa</li>
      <li>bbbbbbbb</li>
      <li>cccccccc</li>
    </ul>
    

       不用事件委托我们会这样做:

     1 window.onload = function(){
     2   var oUl = document.getElementById("ul");
     3   var aLi = oUl.getElementsByTagName("li");
     4   var oBtn = document.getElementById("btn");
     5   var iNow = 4;
     6   for(var i=0; i<aLi.length; i++){
     7     aLi[i].onmouseover = function(){
     8       this.style.background = "red";
     9     }
    10     aLi[i].onmouseout = function(){
    11       this.style.background = "";
    12     }
    13   }
    14 
    15   oBtn.onclick = function(){
    16     iNow ++;
    17     var oLi = document.createElement("li");
    18     oLi.innerHTML = 1111 *iNow;
    19     oUl.appendChild(oLi);
    20   }
    21 
    22   
    23 }

    这样做我们可以看到点击按钮新加的li上面没有鼠标移入事件来改变他们的背景颜色。

    因为点击添加的时候for循环已经执行完毕。

    那么我们用事件委托的方式来做。就是html不变

     1 window.onload = function(){
     2   var oUl = document.getElementById("ul");
     3   var aLi = oUl.getElementsByTagName("li");
     4   var oBtn = document.getElementById("btn");
     5   var iNow = 4;
     6 
     7   oUl.onmouseover = function(ev){
     8     var ev = ev || window.event;
     9     var target = ev.target || ev.srcElement;
    10     //alert(target.innerHTML);
    11     if(target.nodeName.toLowerCase() == "li"){
    12     target.style.background = "red";
    13     }
    14   }
    15   oUl.onmouseout = function(ev){
    16     var ev = ev || window.event;
    17     var target = ev.target || ev.srcElement;
    18     //alert(target.innerHTML);
    19     if(target.nodeName.toLowerCase() == "li"){
    20     target.style.background = "";
    21     }
    22   }
    23   oBtn.onclick = function(){
    24     iNow ++;
    25     var oLi = document.createElement("li");
    26     oLi.innerHTML = 1111 *iNow;
    27     oUl.appendChild(oLi);
    28   }
    29 }

    ok:

    如同在我们用微博中,新发微博照样有之前的鼠标事件。

    转自:http://itindex.net/detail/48661-js-事件

  • 相关阅读:
    几何变换
    螺旋线
    生产环境高可用centos7 安装配置RocketMQ-双主双从-同步双写(2m-2s-sync)
    CentOS7 安装配置RocketMQ --主从模式(master-slave)异步复制
    MybatisPlus----入门
    elasticsearch中term和match以及text和keyboard的解释
    怎么解决Windows的elasticsearch编码闪退问题
    数据库技术之事务
    JDBC------之结果集元数据的操作02
    JDBC------之结果集元数据的操作01
  • 原文地址:https://www.cnblogs.com/hack0573/p/5328288.html
Copyright © 2011-2022 走看看