事件代理又叫事件委托在前端发开中实际是非常有用的,说事件代理之前我们先说说事件绑定

    <p onclick="test()" ></p> 

    function test(){
         do something.....
         alert(this);
    }

js 代码和 html 代码耦合在了一起,不便于维护和开发,尽量不要使用这种方法绑定事件,还有一个不好的地方这样绑定事件this指向的是window而不是元素本身。
或者可以这样绑定

    <p class="text" >22</p> 

    var Text = document.querySelector('.text');
     Text.onclick = function(){
       alert(this.innerText) //22
    }
     

还有一种事件绑定(监听)的方法由于ie 和w3c提供的api不同存在兼容性问题一般要自己封装一下做兼容性的处理。

<p id="test">22</p>
var addEvent = function(elem,type,handler){
     if(window.addEventListener){
        addEvent = function(elem,type,handler){
            elem.addEventListener(type,handler,false);
        }
     }else if(window.attachEvent){
        addEvent = function(elem,type,handler){
            elem.attachEvent('on'+type,handler);
        }
     }
     addEvent(elem,type,handler);
   }

    var inp = document.querySelector("#test");

    addEvent(inp,'click',test);
    function test(){
        alert(this.innerText);  // 弹出22
    } 

好到现在为止常见的事件绑定方式说的都差不多了,事件代理的前提是要有事件绑定通过对父级或者父父级元素进行绑定看下面的例子。

<ul class="list">
        <li>1233</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
    </ul>
    <script>
      var oUl = document.querySelector(".list");
      oUl.onclick=function(e){
            e = e || window.event;
            var elem = e.target || e.srcElemnt;
            if(elem.tagName.toLowerCase() === 'li'){
                alert(elem.innerText);
            }
      }

    </script>

上面的几个例子都是alert出元素的innerText但是采用事件代理方式性能会跟好,因为他不需要给每一个li绑定一个事件只需要给父级绑定一个事件即可。我们看看jq实现事件代理的方式

<ul class="list">
        <li>1233</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
    </ul>
    <script>
        $('.list').on('click','li',delegate)
      function delegate(){
        alert($(this).text());
      }

        //或者这样但是推荐使用上面种方式 $('.list').delegate('li','click',delegate);

    </script>

使用事件代理的时候有一点需要注意的就是事件冒泡如果你的目标元素(上面的例子li就是目标元素)和目标元素父级或者父父级的tagNanme(标签名)相同的话事件就会冒泡的相同标签名的父级上这是就需要阻止事件冒泡。来看一个例子

    <style>

    .box1{
         position:relative;
         width:300px;
         height: 300px;
         background:red;
    }
    .box2{
         position:absolute;
         top:50px;
         left:50px;
         width:200px;
         height:200px;
         background:yellow;
    }
    .box3{
         top:50px;
         left:50px;
         position:absolute;
         width:100px;
         height:100px;
         background:blue;
    }
    </style>
    <div class="box1" >
          box1
        <div class="box2">
              box2
            <div class="box3">
                 box3
            </div>
        </div>

    </div>
    <script>

       $('.box1').on('click','div',delegate)
      function delegate(){
        alert($(this).text());
      }
     //$('.list').delegate('li','click',delegate);

    </script>


在上面的例子中给box1绑定了一个事件弹出box1下面div的innerText当我们点击box3的时候对话框弹出了两次一次是box3的innerText一次是box2的innerText说明事件冒泡到了box3的父级box2哪里也被触发了一次aler innerText 这个时候我们就要用的阻止事件冒泡了。

    <style>

    .box1{
         position:relative;
         width:300px;
         height: 300px;
         background:red;
    }
    .box2{
         position:absolute;
         top:50px;
         left:50px;
         width:200px;
         height:200px;
         background:yellow;
    }
    .box3{
         top:50px;
         left:50px;
         position:absolute;
         width:100px;
         height:100px;
         background:blue;
    }
    </style>
    <div class="box1" >
          box1
        <div class="box2">
              box2
            <div class="box3">
                 box3
            </div>
        </div>

    </div>
    <script>

       $('.box1').on('click','div',delegate)
      function delegate(e){
               e.stopPropagation();
        alert($(this).text());
      }
     //$('.list').delegate('li','click',delegate);

    </script>

在原有的基础上多加了一句 e.stopPropagation(); 这样就可以得到我们想要的效果了。
事件代理一般用在什么样的场景呢?
1 当有多个相同标签名的元素需要绑定事件的时候如ul 下面的li需要给每个li绑定事件 我们就可以给ul去绑定事件去做处理。
2 从后端获取数据生成的节点元素需要绑定事件的时候。

javascript 事件代理及应用的更多相关文章

  1. JavaScript事件代理和委托(Delegation)

    JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...

  2. JavaScript事件代理和委托

    在javasript中,代理.委托经常出现. 那么它究竟在什么样的情况下使用?它的原理又是什么? 这里介绍一下javascript delegate的用法和原理,以及Dojo,jQuery等框架中de ...

  3. JavaScript 事件代理

    转自:http://www.cnblogs.com/silence516/archive/2009/09/03/delegateEvent.html 如果你想给网页添加点JavaScript的交互性, ...

  4. 【转载】浅谈事件冒泡与事件捕获 - javascript 事件代理

    原文:https://segmentfault.com/a/1190000000749838 事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发 ...

  5. JavaScript事件代理入门

    事件代理(Event Delegation),又称之为事件委托.是 JavaScript 中常用绑定事件的常用技巧. 顾名思义,“事件代理”即是把原本需要绑定的事件委托给父元素,让父元素担当事件监听的 ...

  6. JavaScript事件代理和事件委托

    一.概述: 那什么叫事件委托呢?它还有一个名字叫事件代理,JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.那这是什么意思呢?网上的 ...

  7. javascript事件代理(委托)

    之前有接触过事件代理,但是印象并不深刻.这次记下来加强印象. 用个大家比较常见的代码举例子: html dom结构: <ul id="ul1"> <li>0 ...

  8. javascript事件代理(Event Delegation)

    看了几篇文章,放上来供参考 司徒正美的文章,Event Delegation Made Easy --------------------------------------------------- ...

  9. JavaScript 事件代理绑定

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. JS创建类和对象(好多方法哟!)

    http://www.cnblogs.com/tiwlin/archive/2009/08/06/1540161.html 这是别人写的~~~我借来看看 JavaScript 创建类/对象的几种方式 ...

  2. JAVA操作properties文件

    va中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties ...

  3. python之3内置容器

    所谓内置容器,就是不需要第三方模块,就可以使用的. 1.list容器,一个有序序列,类似于数组,但比数组强大很多 1.1.如何初始化list,直接一个[]即可,这是一个空的list >>& ...

  4. C语言运算符的注意问题

    //对于自增和自减运算符的运算规律值得研究,小心被坑.1 #include<stdio.h> int main(void){ ,j=,p,q; p=(i++)+(i++)+(i++); q ...

  5. ccf练习---节日

    问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日. 现在,给你a,b,c和y1, y2(1850 ≤ y1, y2 ≤ 2 ...

  6. 利用Azure Automation实现云端自动化运维(3)

    Azure automation的认证方式:证书   该种方式是推荐的进行Automation认证的方式,好处在于安全性高,过期时间由自己控制,不好的地方在于大家在Windows上要生成证书比较麻烦, ...

  7. lisp构造表

    CONS 操作符 我们刚刚学习了如何拆分一个表,现在学习如何合并一个表. CONS 操作符就是做这件事情的. 假设有一个列表 (1 2 3) ,我们做一下 CAR 操作: (car '(1 2 3)) ...

  8. 场景2 nginx 错误日志格式:

    nginx 错误日志格式: 2016/09/01 11:23:36 [error] 28388#0: *14549 open() "/var/www/zjzc-web-frontEnd/im ...

  9. 【转】飞凌嵌入式(Forlinx)TE/OK6410内核编译:“make: arm-none-linux-gnueabi-gcc:命令未找到”

    原文网址:http://www.xuebuyuan.com/1104711.html Ubuntu10.04下编译飞凌嵌入式(Forlinx)TE/OK6410开发板提供的内核2.6.36 本以为按照 ...

  10. 在javascript中使用com组件的方法

    转载自:  http://dhailin.blog.163.com/blog/static/230738322011128102043880/ 首先创建一个COM组件,插入一个双接口Itest,在此接 ...