• 事件委托


    概述:

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

      举个列子:有三个同事预计会在周一收到快递。为签收快递,有两种办法:一是三个人在公司门口等快递;二是委托给前台MM代为签收。现实当中,我们大都采 用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递)。前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款。这 种方案还有一个优势,那就是即使公司里来了新员工(不管多少),前台MM也会在收到寄给新员工的快递后核实并代为签收。

      事件委托主要应用于给大量相同的dom元素绑定事件和给尚不存在的元素绑定事件。

      事件委托是利用事件的冒泡原理来实现的,何为事件冒泡呢?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一个节点 树,div>ul>li>a;比如给最里面的a加一个click点击事件,那么这个事件就会一层一层的往外执行,执行顺序 a>li>ul>div,有这样一个机制,那么我们给最外面的div加点击事件,那么里面的ul,li,a做点击事件的时候,都会冒泡 到最外层的div上,所以都会触发,这就是事件委托,委托它们父级代为执行事件。

    事件委托怎么实现:

    先来个栗子:给ul下的每个li绑定click事件

    <ul id="list">
    <li>aaa</li>
    <li>bbb</li>
    <li>ccc</li>
    <li>ddd</li>
    <ul>

    不使用事件代理是处理如下:

    window.onload = function(){
        var oUl = document.getElementById("list");
        var aLi = oUl.getElementsByTagName('li');
        for(var i=0;i<aLi.length;i++){
            aLi[i].onclick = function(){
                alert('aaa');
            }
        }
    }

    这样当存在大量的li时,会频繁的操作dom,不利于用户体验。

    事件委托处理如下:

    window.onload = function(){
        var oUl = document.getElementById("list");
       oUl.onclick = function(ev){
            var ev = ev || window.event;
         var target = ev.target || ev.srcElement;//标准浏览器用ev.target,IE浏览器用event.srcElement,
    if(target.nodeName.toLowerCase() == 'li'){
      alert(target.innerHTML);
    } } }

    这样改下就只有点击li会触发事件了,且每次只执行一次dom操作,如果li数量很多的话,将大大减少dom的操作,优化的性能可想而知!

    在jquery中的事件委托方法为:on(),以前为:delegate()

    $(function(){ 
         $('#list').on('click','li',function(){ 
                ....
          }) 
    });

    总结:

    适合用事件委托的事件:click,mousedown,mouseup,keydown,keyup,keypress。

    值得注意的是,mouseover和mouseout虽然也有事件冒泡,但是处理它们的时候需要特别的注意,因为需要经常计算它们的位置,处理起来不太容易。

    不适合的就有很多了,举个例子,mousemove,每次都要计算它的位置,非常不好把控,在不如说focus,blur之类的,本身就没用冒泡的特性,自然就不能用事件委托了。

  • 相关阅读:
    python输出shell命令执行结果
    python实验二:字符串排序
    python学习系列
    linux命令系列目录
    git初步
    HTML基础教程 七 高级
    HTML/CSS基础教程 六
    linux命令---sed
    linux命令---unzip
    模块
  • 原文地址:https://www.cnblogs.com/gkl2013/p/5804394.html
Copyright © 2020-2023  润新知