JavaScript事件性能优化

news/2024/7/10 4:45:42 标签: JavaScript, 事件, 优化

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

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

<body>
    <table id="table1">
        <thead>
            <tr>
                <th>标识符</th>
                <th>名称</th>
                <th>国家</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>张三</td>
                <td>CHI</td>
                <td><a href="javascript:void(0);" id="link1">修改</a></td>
            </tr>
            <tr>
                <td>2</td>
                <td>李四</td>
                <td>CHI</td>
                <td><a href="javascript:void(0);" id="link2">修改</a></td>
            </tr>
        </tbody>
    </table>
    <script src="../../../Scripts/common.js"></script>
    <script type="text/javascript">

        //注册事件处理程序
        document.getElementById("link1").onclick = function () {
            console.log(window.event.target);
        }
        
        document.getElementById("link2").onclick = function () {
            console.log(window.event.target);
        }

        window.onunload = function () {
            //清除事件处理程序
            document.getElementById("link1").onclick = null;
            document.getElementById("link2").onclick = null;
        }
        
    </script>
</body>

每当将事件处理函数指定给元素时,运行中的浏览器代码与支持页面交互的JavaScript代码之间就会建立一个连接。这种连接越多,页面执行起来就越慢。我们可以在不需要的时候移除事件处理程序。

在两种情况下,可能会造成性能问题。第一种是从文档中移除带有事件处理函数的程序元素时,例如使用removeChild()replaceChild()方法,但更多的使用了innerHTML替换页面中的某一部分。

导致“空事件处理程序”的另一种情况是,在卸载页面的时候。如果在页面卸载之前没有干净的清除事件处理程序,那它们就会滞留在内存中。每次加载完页面再卸载,内存中滞留的对象数量就会增加,因为事件处理程序没有被清除。

一般来说,最好的做法是在页面卸载之前,先通过onunload事件处理程序移除所有的事件处理程序。

        //注册事件处理程序
        document.getElementById("link1").onclick = function () {
            console.log(window.event.target);
        }
        
        document.getElementById("link2").onclick = function () {
            console.log(window.event.target);
        }

        window.onunload = function () {
            //清除事件处理程序
            document.getElementById("link1").onclick = null;
            document.getElementById("link2").onclick = null;
        }

 


http://www.niftyadmin.cn/n/1740238.html

相关文章

数据库逻辑查询各个阶段(From阶段)

逻辑查询处理 SQL与其他编程语言不同的最明显特征是代码的查询顺序。在大多数语言中&#xff0c;代码是按照编写顺序来处理的&#xff1b;但在SQL中&#xff0c;第一个要处理的子句是FROM子句&#xff0c;尽管SELECT是第一个出现&#xff0c;但它几乎都是最后才处理。 每一步…

数据库逻辑查询各个阶段(Where,Group By,Having阶段)

步骤2&#xff1a;Where阶段 对上一步返回的虚拟表中返回的所有行应用Where筛选器。只有让<where_predicate>逻辑条件为True的行&#xff0c;才会组成这一步要返回的虚拟表VT2。 注意&#xff1a;由于还有对表进行分组&#xff0c;所以在Where子句中不能使用聚合。 对…

数据库逻辑查询各个阶段(SELECT,ORDER BY阶段)

步骤5&#xff1a;SELECT阶段 虽然SELECT子句出现在查询的最前面&#xff0c;但却放在第五步处理。 步骤5-1&#xff1a;计算表达式 SELECT列表中的表达式可以返回上一步得到的虚拟表的基础列&#xff0c;也可以是对这些基础列的操作。如果查询是一个聚合查询&#xff0c;就…

error CS0234: 命名空间“XXX”中不存在类型或命名空间名“MVC”(是否缺少程序集引用?)

今天将MVC中的动作方法&#xff0c;移到测试项目中&#xff0c;没想到编译时这个错误&#xff0c;在网上搜了下&#xff0c;没找到解决方案。 后来根据以前的经验判断应该是版本不一致导致的错误。首先检测了这个程序集System.Web.5.2.6Mvc的版本&#xff0c;发现的确不一致MV…

JavaScript 变量名注释风格

变量名注释风格 由于自JavaScript中变量是松散类型的&#xff0c;很容易就忘记变量所表示的数据类型&#xff0c;有三种方式表示数据类型的方式。 第一种是初始化时指定变量类型 var num 0; //intvar name ""; //stringvar isDelete false; //Boolean 初…

情商(压力与工作表现)

心理分析学家提醒我们&#xff0c;能够满足我们所有期望&#xff0c;并且洞察、 满足我们所有需求的完美恋人是不可能存在的。 如果我们能够意识到恋人或者配偶不可能补偿我们童年时期的所有缺憾&#xff0c;我们就能够以更加客观、 现实的态度来对待自己的恋人&#xff0c;而不…

SQL Server查询优化(实例级别等待)

在处理性能问题时&#xff0c;数据库专家倾向于关注系统的技术层面&#xff0c;如资源队列、资源利用率等。而用户只把性能问题简单地认为是等待时间&#xff0c;他们发出一个请求&#xff0c;然后等待返回结果。用户通常认为 在交互请求后&#xff0c;超过三秒才得到响应&…

JavaScript松散耦合

只要应用的某个部分过分依赖与另一部分&#xff0c;代码就是耦合过紧&#xff0c;难于维护。紧密耦合的代码难于维护并且需要经常重写。 因为Web应用所涉及的技术&#xff0c;有多种情况会使它变的耦合过紧。必须小心这些情况&#xff0c;并尽可能维护耦合弱的功能。 1. 解耦…