zoukankan      html  css  js  c++  java
  • JavaScript(jQuery)中的事件委托

    一:什么是事件委托?

        事件委托是利用事件冒泡,只指定一个事件处理程序来管理某一类型的所有事件。

    二:为什么要用事件委托?

        1.在JavaScript中添加到页面上的事件处理程序的个数直接关系到页面的整体运行性能。为什么呢?因为,每个事件处理函数都是对象,对象会占用内存,内存中的对象越多,性能就越差。此外,必须事先指定所有的事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪时间。

        2.对有很多个数据的表格以及很长的列表逐个添加事件,简直就是噩梦。所以事件委托,能极大地提高页面的运行性能,减少开发人员的工作量。

    三:JavaScript中的例子

          我们以下面的HTML代码为例,用事件委托的方式实现当鼠标单击某个li元素的时候,li元素的背景变成红色。

    复制代码
    1  <ul id = "lists">
    2          <li>列表1</li>
    3          <li>列表2</li>
    4          <li>列表3</li>
    5          <li>列表4</li>
    6          <li>列表5</li>
    7          <li>列表6</li>
    8  </ul>
    复制代码

     下面是JavaScript代码:

    复制代码
     1         var lists = document.getElementById("lists");
     2 
     3         lists.addEventListener("click",function(event){
     4 
     5             var target = event.target;
     6             //防止父元素ul也触发事件
     7             if(target.nodeName == "LI"){
     8                target.style.backgroundColor = "red";
     9             }
    10         })
    复制代码

    单击列表4,实现效果:

    未单击之前单击列表4之后

     三:jQuery中的例子

        jQuery中的事件委托方式比较丰富,就以同样的例子来说:

       1、用on方法,代码如下:

    复制代码
    1  $(function(){
    2             $("#lists").on("click","li",function(event){
    3                 var target = $(event.target);
    4                 target.css("background-color","red");
    5             })
    6         })
    复制代码

    2.用delegate()方法,代码如下:

    复制代码
    1         $(function(){
    2             $("#lists").delegate("li","click",function(event){
    3                 var target = $(event.target);
    4                 target.css("background-color","red");
    5             })
    6         })
    复制代码

    on()方法和delegate()方法对于事件委托的写法很像。并且执行事件委托的时候只有子元素(本文中的li)会触发事件,而代为执行的父元素(本文中为ul)不会触发事件,所以我们不需要盘判断触发事件的元素节点名,这一点明显优于原生的JavaScript。

    3.用bind()方法,代码如下:

    复制代码
    1        $(function(){
    2             $("#lists").bind("click","li",function(event){
    3                 var target = $(event.target);
    4                 if(target.prop("nodeName")=="LI"){
    5                 target.css("background-color","red");}
    6             })
    7         })
    复制代码

    bind()方法同原生的JavaScript实现方法一样,当父元素代子元素执行事件时,父元素也会触发事件,所以我们需要判断一下触发事件的元素名。此外,用bind()方法给元素绑定事件的时候要注意,它只能给已经存在DOM元素添加事件,不能给未来存在DOM

    元素添加添加事件。如果要频繁地添加DOM元素,并且给新添加的DOM元素绑定事件的话,用live(),delegate(),on()等方法。鉴于jQuery从1.7之后就不推荐live()和delegate()方法了,所以大家还是使用on()方法吧。

  • 相关阅读:
    常用的npm指令总结
    Mongoose基础
    2016总结与展望
    sleep与wait的区别
    查询平均分大于80分的学生
    求最大不重复子串
    快速排序
    按位与(&)运算的作用
    异或运算的作用
    java 字符串中的每个单词的倒序输出
  • 原文地址:https://www.cnblogs.com/gopark/p/9037428.html
Copyright © 2011-2022 走看看