事件委托

作者: ferrint | 来源:发表于2017-02-26 17:42 被阅读23次

关键词:事件委托

原理:利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
例如:如果不加以限制,click事件会一直冒泡到document层次。也就是说,我们可以为整个页面指定一个onclick事件处理程序,而不必给每个可单击的元素分别添加事件处理程序。

下面我们通过一个小例子来了解事件委托

<!-- html代码 -->
<button id="btn">添加标签</button>
<ul id="ul">
    <li>1111</li>
    <li>2222</li>
    <li>3333</li>
</ul>
    /*js代码*/
window.onload = function(){
    var oUl = document.querySelector("#ul");
    var aLi = document.querySelectorAll("li");
    var oBtn = document.querySelector("#btn");
    var iNow = 3;
  oUl.addEventListener('mouseover',function(e){
        if(e.target.tagName.toLowerCase() == "li"){
           e.target.style.background = "red";
        }
  });
  oUl.addEventListener('mouseout',function(e){
        if(e.target.tagName.toLowerCase() == "li"){
           e.target.style.background = "";
        }
  });  
    oBtn.onclick = function(){
        iNow ++;
        var oLi = document.createElement("li");
        oLi.innerHTML = 1111 *iNow;
        oUl.appendChild(oLi);
    }
}

我们发现,当我们单击button添加li标签之后,并没有实现鼠标移入背景变色的效果,这是因为我们的循环的只是当前所有标签,当添加新标签之后,新增标签不在循环之内,所以没有效果。

如果加入我们给ul标签添加事件委托,会有什么效果呢?

  /*js代码*/
window.onload = function(){
    var oUl = document.querySelector("#ul");
    var aLi = document.querySelectorAll("li");
    var oBtn = document.querySelector("#btn");
    var iNow = 3;
    oUl.addEventListener('mouseover',function(e){
        if(e.target.tagName.toLowerCase() == "li"){
           e.target.style.background = "red";
        }
     });
     oUl.addEventListener('mouseout',function(e){
        if(e.target.tagName.toLowerCase() == "li"){
           e.target.style.background = "";
        }
     });  
     oBtn.onclick = function(){
        iNow ++;
        var oLi = document.createElement("li");
        oLi.innerHTML = 1111 *iNow;
        oUl.appendChild(oLi);
    }
}

我们给ul标签添加了事件委托之后,发现新增的li标签也有利鼠标移入的效果。

这是因为ul标签委托了所有子元素,当鼠标移入移入某个li标签是,就会触发ul 标签委托的监听事件。


事件委托在jQuery中有更简洁的表达:

/*普通方法*/
$('ul li').on('mouseover',function() {}
/*事件委托*/
$('ul').delegate('li','mouseover',function(){}

值得关心的事,由于事件监听抛弃了for循环的方式,代码执行的速度更快,有利于提高性能。


以上代码以演示为主,为了方便,没有考虑浏览器兼容问题

相关文章

  • 事件委托

    ------------------事件委托----------------- 事件: 事件委托: 原理: 冒泡 ...

  • web前端面试题@六(事件委托)

    *说到事件委托,我们首先先要知道什么是事件委托—— · 那么什么是事件委托呢??? JS里的事件委托就是当事件...

  • 前端常见面试题(十一)@郝晨光

    什么是事件委托?为什么要用事件委托? 什么是事件委托? 事件委托,又称事件代理,就是将元素的事件处理交由父元素或者...

  • 十六、DOM之事件委托 ------ 2020-01-05

    1、事件委托: 2、事件委托的优势:

  • JQuery事件委托

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

  • 事件委托笔记

    事件委托原理:事件冒泡机制。 什么是事件委托: 事件委托——给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪...

  • 事件委托

    事件委托 什么是事件委托(事件代理): 事件委托就是利用事件冒泡的原理,将事件注册到父元素上,减少子元素的事件注册...

  • JavaScript 事件委托

    1. 事件委托 事件处理程序过多的解决方法就是事件委托,事件委托利用的是事件冒泡。事件冒泡:事件由最具体的元素接收...

  • 原始类型与事情委托

    1.绑定事件: 二、事件冒泡与事件捕获 事件委托 案例见事件委托 计时器

  • 事件(二)

    一.事件委托# 事件委托就是利用事件冒泡的原理,把事件添加到父元素或祖先元素上,触发执行效果 事件委托优点1、提高...

网友评论

    本文标题:事件委托

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