zoukankan      html  css  js  c++  java
  • 事件委托

    什么是事件委托:

    事件委托——给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪个子元素的事件。(不理解冒泡的可以去百度下)

    定义:
    利用事件冒泡处理动态元素事件绑定的方法,专业术语叫事件委托。 使用事件委托技术可以避免对特定的每个节点添加事件监听器,相反,事件监听器是被添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。

    事件委托的好处:

    事件委托技术可以避免对每个字元素添加事件监听器,减少操作DOM节点的次数,从而减少浏览器的重绘和重排,提高代码的性能。

    使用事件委托,只有父元素与DOM存在交互,其他的操作都是在JS虚拟内存中完成的,这样就大大提高了性能。

    什么时候用事件委托:

    当子元素有很多,需要对子元素的时间进行监听的时候

    案例:

    (1)原生JS实现事件委托效果

    <!DOCTYPE html>
    <html>
    <head>
    <title>事件委托测试</title>
    </head>
    <body>
    <style type="text/css">
    *{margin: 0;padding: 0;}
    a{text-decoration: none;}
    ul,li{list-style: none;}
    div{display: block; 500px;padding: 200px 0 0 200px;}
    div ul li{display: block; 100%;text-align: center;height: 35px;line-height: 35px;}
    div ul li:nth-child(2n){background: #f00;}
    </style>
    <div>
        <ul>
            <li><a>测试1</a></li>
            <li><a>测试2</a></li>
            <li><a>测试3</a></li>
            <li><a>测试4</a></li>
            <li><a>测试5</a></li>
            <li><a>测试6</a></li>
            <li><a>测试7</a></li>
            <li><a>测试8</a></li>
        </ul>
    </div>
    <script type="text/javascript">
    document.getElementsByTagName("ul")[0].addEventListener('click',function(e){
        alert("点击的内容是:"+e.target.innerHTML);
    });
    </script>
    </body>
    </html>
    

      

    事件委托三部曲:
    第一步:给父元素绑定事件
    给元素ul添加绑定事件,通过addEventListener为点击事件click添加绑定

    第二步:监听子元素的冒泡事件
    这里默认是冒泡,点击子元素li会向上冒泡

    第三步:找到是哪个子元素的事件

    通过匿名回调函数的参数e用来接收事件对象,通过target获取触发事件的目标

    JQ实现事件委托:

    <!DOCTYPE html>
    <html>
    <head>
    <title>事件委托测试</title>
    </head>
    <body>
    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
    <style type="text/css">
    *{margin: 0;padding: 0;}
    a{text-decoration: none;}
    ul,li{list-style: none;}
    div{display: block; 500px;padding: 200px 0 0 200px;}
    div ul li{display: block; 100%;text-align: center;height: 35px;line-height: 35px;}
    div ul li:nth-child(2n){background: #f00;}
    </style>
    <div>
        <ul>
            <li><a>测试1</a></li>
            <li><a>测试2</a></li>
            <li><a>测试3</a></li>
            <li><a>测试4</a></li>
            <li><a>测试5</a></li>
            <li><a>测试6</a></li>
            <li><a>测试7</a></li>
            <li><a>测试8</a></li>
        </ul>
    </div>
    <script type="text/javascript">
    $("ul").on('click',function(e){
        alert("点击的内容是:"+$(e.target).text());
    });
    </script>
    </body>
    </html>
    

      

    事件委托在面试中还是经常被问到的,

    比如下面的代码

    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>

    现在问题来了?怎么样高效的给li元素绑定事件,当用户单击li元素的时候能够提示li元素中的内容?

    如果这个用JQUERY来做很好解决

    $(function(){

         $("li").on("click",funcition(){

              alert($(this).text());  或者写成 alert($(this).html());

            }

        })

    但是用原生的JS来写最初的想法是:

    window.onload = function() {

    var ul = document.getElementById("ul");

    var lis = ul.getElementsByTagName("li");  //注意这个地方有错误,getElementsByTagName 是document的方法,写在ul 上有有错误的。所以必须写成

    var lis = document.getElementsByTagName("li");

    for(var i = lis.length-1;i>=0;i--) {

      lis[i].onclick = function() {

             alert(this.innerHTML);

              }

         }

            }

    这种想法是最简单也是最直观 也是正确的,但是存在一定的问题,当DOM中的li

    元素特别多的时候,这样的循环遍历的绑定操作势必会占用大量的资源,这个时候

    我们可以使用事件的一些特性,将操作绑定到ul元素上面,当事件触发时,自动获取

    当前事件操作的对象,然后再完成操作,来看下面的代码:

    window.onload = function(){

          var ul = document.getElementById("ul");

          ul.onclick=function(e) {

            e = window.event?window.event:e;           // 这个地方也可以写成 e = e || window.event; 

                                                                             //是为了更好的兼容IE浏览器和非ie浏览器。  

                                                                             //在ie浏览器中,window.event是全局变量,在非ie中,就需要自己传入一个参数来获取event啦,所以就有了var e = e||window.event
                   

           var who = e.target?e.target : e.srcElement;  

          alert(who.innerHTML);  

           }

        }

  • 相关阅读:
    SpringBoot启动类踩坑
    数组作业
    多态的使用
    intellij idea怎么设置软件启动时选择项目进入
    方法的递归调用
    取一个数字数字后4位的和
    day09作业
    java 随机数
    java 方法
    java 循环作业
  • 原文地址:https://www.cnblogs.com/agansj/p/8934563.html
Copyright © 2011-2022 走看看