zoukankan      html  css  js  c++  java
  • javascript性能优化 之 事件委托

    为下面每个LI绑定一个click事件

        <ul id="myLinks">
           <li id="goSomewhere" >Go somewhere</li>
           <li id="doSomething" >Do something</li>
           <li id="sayHi" >Say hi</li>
        </ul>

    1、传统写法

        var item1=document.getElementById("goSomewhere");
        var item2=document.getElementById("doSomething");
        var item3=document.getElementById("sayHi");
    
        item1.onclick = function(){
            console.log('goSomewhere');
        }
        item2.onclick = function(){
            console.log('doSomething');
        }
        item3.onclick = function(){
            alert("hello");
        }

      在javascript中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能,事件越多,性能越差。
      导致原因是多方面:
        1、每个函数都是对象,都会占用内存;内存中的对象越多,性能就越差。
        2、必须事先指定所有事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪时间。

    2、事件委托

      对“事件处理程序过多”问题的解决方案就是事件委托。
      事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。例如:click事件会一直冒泡到document层次。也就是说,我们可以为整个页面指定一个onclick事件处理程序,而不必给每个可单击的元素分别添加事件处理程序。

      事件委托方法:

        var list=document.getElementById("myLinks");
    
        list.onclick = function(e){
            var target = e.target;        
            switch(target.id){
                case "goSomewhere":
                    console.log('goSomewhere');
                    break;  
    
                case "doSomething":
                    console.log('doSomething');
                    break; 
    
                case "sayHi":
                    alert("hello");
                    break; 
            }
        }

    3、使用事件委托的优点:
      1)document对象很快就可以访问,而且可以在页面生命周期的任何时间点上为它添加事件处理程序(无需等待DOMContentLoaded或load事件)。换句话说,只要可单击的元素呈现在页面上,就可以立即具备适当的功能。
      2)在页面中设置事件处理程序所需的时间更少。只添加一个事件处理程序所需的Dom引用更少,所花的时间也更少。
      3)整个页面占用的内存空间更少,能够提升整体性能。

     

    参考自《javascript高级程序设计》

  • 相关阅读:
    线程池
    单例设计模式
    String,StringBuffer,StringBuilder
    马踏棋盘算法
    最短路径问题 (迪杰斯特拉算法,弗洛伊德算法)
    最小生成树 修路问题(普里姆算法,克鲁斯卡尔算法)
    贪心算法 求解集合覆盖问题
    Stream 数组转换
    unittest与pytest对比
    条件编译
  • 原文地址:https://www.cnblogs.com/duanhuajian/p/3049245.html
Copyright © 2011-2022 走看看