美文网首页javascript 知识点
JS和JQuery中的事件委托

JS和JQuery中的事件委托

作者: 赵碧菡 | 来源:发表于2017-07-04 18:20 被阅读46次
什么是事件委托(事件代理)

事件委托通俗来讲就是利用冒泡的原理,把事件追加到父级,触发执行效果。比如当一个父节点下的多个子节点绑定相同的事件时,可以利用事件冒泡机制,将事件委托给父元素执行,这时候只需要绑定一个事件便可以触发子元素的事件。

事件委托的优点
  • 只需注册一个事件,节省大量内存空间。
  • 可以实现 当新增子元素时不需再为其绑定事件,尤其是动态部分的内容,比如Ajax不需再为新增的元素进行绑定和对删除的元素解除绑定。
事件委托的缺点
  • 事件委托是基于事件冒泡的,如果不支持事件冒泡则不能进行事件委托。
  • 如果层级过多,冒泡过程中可能受阻。
事件委托使用情景
  • 为DOM中的很多元素绑定相同事件;
  • 为DOM中尚不存在的元素绑定事件
事件委托的实现 -------- 实例1

先看一段html代码,要实现的功能就是当点击 li 时弹出123.

<ul id="ul">
     <li>111</li>
      <li>222</li>
     <li>333</li>
</ul>

普通方法实现,这种方法操作,每次点击li时,都会寻找目标 li 的位置,然后才能执行最后的操作。这种方法实现显然操作dom的次数很多。

var Oul=document.getElementById("ul");
var Oli=Oul.getElementsByTagName("li");
for(var i=0;i<Oli.length;i++){
      Oli[i].onclick=function(){
        alert(123);
     }
}

下面使用事件委托来实现,用这种方法来实现 只有点击 li 时才触发事件,且每次只执行一次dom 操作。大大减少了dom操作,提高了性能。

var Oul=document.getElementById("ul");
Oul.onclick=function(e){
      var e=e || window.event;
      var target=e.target ||  e.srcElement;
      if(target.nodeName.toLowerCase()=='li'){
             alert(123);
             alert(target.innerHTML);
      }
} 

事件委托的实现 -------- 实例2

当点击元素 实现的功能不一样时,怎么实现?

<div id="box">
        <input type="button" id="add" value="添加" />
        <input type="button" id="remove" value="删除" />
        <input type="button" id="move" value="移动" />
        <input type="button" id="select" value="选择" />
</div>

先看看普通方法的实现,这种方法实现至少要进行四次dom操作。

var add=docment.getElementById("add");
var remove=docment.getElementById("remove");
var move=docment.getElementById("move");
var select=document.getElementById("select");
add.onclick=function(){
     alert("add");
}
remove.onclick=function(){
    alert("remove");
}
 move.onclick=function(){
    alert(" move");
}
select.onclick=function(){
    alert("select");
}

下面用事件委托来实现,只需要一次dom 操作。

var box=docment.getElementById("box");
box.onclick=function(e){
     var e= e || window.event;
     var target=e.target || e.srcElement;
     if(target.nodeName.toLowerCase()=='input'){
       switch(target.id){
            case 'add':
                alert("add");
                break;
            case 'remove':
                alert("remove");
                break;
            case 'move':
                alert("move");
                break;
            case 'select':
                alert("select");
                break;
        }
    }
}
事件委托的实现 -------- 实例3

为新增节点绑定事件,当鼠标移入 li 背景颜色变成红色,当鼠标 移除 li 背景颜色变为白色,点击input 添加一个 li。

<input type="button" name="" id="btn" value="添加" />
    <ul id="ul">
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
    </ul>

一样先看看普通方法的实现,使用这种方法会发现 新增的 li 没有绑定事件,而且执行dom次数非常多。为新增的 li 绑定事件,可以将for封装在一个函数里,然后再去调用这个函数。

var btn=document.getElementById("btn");
var Oul=document.getElementById("ul");
var Oli=Oul.getElementsByTagName("li");
var num=4;
for(var i=0;i<Oli.length;i++){
    Oli[i].onmouseover=function(){
        this.style.background='red';
   }
   Oli[i].onmouseout=function(){
       this.style.background='#fff';
   }
}
   btn.onclick=function(){
     ++num;
     var li=document.createElement('li');
     li.innerHTML=num*111
     Oul.appendChild(li);
  }

用委托事件来实现

var btn=document.getElementById("btn");
var Oul=document.getElementById("ul");
Oul.onmouseover=function(e){
       var e= e || window.event;
       var target=e.target || e.srcElement;
       if(target.nodeName.toLowerCase()=='li'){
              target.style.background="red";
        }
}
Oul.onmouseout=function(e){
      var e=e || window.event;
      var target=e.target || e.srcElement;
      if(target.nodeName.toLowerCase()=='li'){
          target.style.background="#fff";
      }
}
btn.onclick=function(){
     ++num;
     var li=document.createElement('li');
     li.innerHTML=num*111
     Oul.appendChild(li);
  }

由上面的例子可以发现,当用事件委托的时候,根本不需要去遍历子元素直接给父元素绑定事件就可以 了。


JQuery中的事件委托
  • delegate() 之后被on()方法代替。
$("ul").'li'('li','click',function(){
     alert('li');
  })
  • on() 支持事件绑定的全部功能。
$("ul").on('click','li',function(){
     alert('li');
  })

delegate 和 on 的区别,selector 和events的顺序不同,on 可以省略selector ,而delegate不可以。

相关文章

  • jQuery事件委托和JS事件委托

    jQuery事件委托没得说,直接用on的方式在事件类型参数的后边加一个真正触发事件的对象即可,同时jQuery提供...

  • JS和JQuery中的事件委托

    什么是事件委托(事件代理) 事件委托通俗来讲就是利用冒泡的原理,把事件追加到父级,触发执行效果。比如当一个父节点下...

  • JQuery事件委托

    JavaScript(jQuery)中的事件委托 一:什么是事件委托? 事件委托是利用事件冒泡,只指定一个事件...

  • JS写事件代理

    js中的事件委托或是事件代理详解

  • JS中的事件和事件委托

    事件传播机制捕获阶段:点击当前元素时,首先从最外层开始向内查找(找到要操作的事件源),查找目的是构造出冒泡传播的路...

  • javascript事件委托和jquery事件委托

    元旦过后,新年第一篇。初衷:很多的面试都会涉及到事件委托,前前后后也看过好多博文,写的都很不错,写的各有千秋,自己...

  • JS与Jquery的事件委托

    概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件...

  • JS与Jquery的事件委托

    概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件...

  • 3 jQuery03 事件

    1、jQuery事件发展史: (1).jQuery事件底层封装的都是原生js中的addEventListener(...

  • 20、jQuery 事件机制

    20、jQuery 事件机制 原生js事件与jQuery事件: (1)用原生的js给div注册事件 原生js注册相...

网友评论

    本文标题:JS和JQuery中的事件委托

    本文链接:https://www.haomeiwen.com/subject/rxrxhxtx.html