由于事件处理程序是现代的web程序交互能力的提供者

所以在日常实践中,我们免不了要向页面中添加大量的事件处理程序(不管是用于用户交互还是用于统计用户数据)

在创建GUI(图形用户界面)的语言(如C#)中,为GUI中的每一个按钮添加一个onclick事件是司空见惯的事,并且这样做并不会有什么问题

但是在JS中情况就截然不同了,因为在web应用中添加到页面上的事件处理程序的数量将直接影响页面的整体运行性能

导致这一问题的原因有以下几点:

  • JS中每个函数都是对象,都会占用内存,内存占用越多性能越差
  • 由于JS需要事先指定事件处理程序,所以会导致DOM访问次数的增加,随着访问次数的增加会延迟整个页面的交互时间

但是我们可以用一些技巧来改善页面的性能

事件委托

对于页面中事件处理程序过多这一现象的解决方法就是采用事件委托

事件委托可以大幅降低页面中事件处理程序的数量

那么什么是事件委托呢?

事件委托就是利用事件冒泡,给整个页面添加一个事件处理程序就可以管理这一类的事件

以onclick 事件为例

一般情况下我们很有可能为页面上的所有可点击元素都添加他们的事件处理程序

但是这样一来页面上的事件处理程序的数量就可想而知了

但如果我们采用事件委托的方式,如下代码所示:

<ul id = "myLinks">
<li id="1">1</li>
<li id="2">2</li>
</ul>

对于上述的HTML结构,我们可以用下面的方式为其添加事件处理程序

var list = document.getElementById("myLinks");

list.onlick = function(event){
var target = event.target; switch(target.id){
case "1":
alert("1");
break;
case "2":
alert("2");
break;
}
}

这样一来一个事件处理程序就可以完成原本两个或者更多事件处理程序的工作

如果条件允许的话,我们甚至可以直接为document添加一类的事件处理程序

然后在内部再对其进行细分,完成不同的操作

移除事件处理程序

JS中的垃圾回收机制我们之前提到过

除了对于循环引用可能造成内存泄漏之外

对于事件的处理不当也会造成内存泄漏,甚至更为严重

因为这一类的内存泄漏比循环引用更加不易察觉

由于事件处理程序会占用内存,所以一旦我们从页面中删除了事件处理程序所绑定的元素

而没有对已经绑定的事件处理程序解除引用,这样一来事件处理程序所占用的内存就得不到释放

随着泄漏的内存增加,页面性能自然就会逐渐降低

所以改善页面性能另一个重要的地方就在于要及时地移除事件处理程序

即当我们知道某个元素即将被移的时候,那么我们最好手动地移除事件处理程序

方法如下:

  • 将onclick等事件属性设为 null
  • 对于addEventListener 添加的事件 我们用对应的 removeEventListener移除即可

Javascript高级编程学习笔记(70)—— 事件(14)内存和性能的更多相关文章

  1. JavaScript高级程序设计学习笔记之事件

    1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...

  2. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

  3. Javascript高级编程学习笔记(72)—— 模拟事件(2)IE事件模拟

    IE中的事件模拟 低版本的IE浏览器作为前端开发的一股清流,想避过都不行 虽然低版本IE正在逐步被市场淘汰,不得不承认IE8以下的浏览器依然占了不小的份额 所以这里大概介绍IE8以下的低版本IE中的事 ...

  4. Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟

    事件,指的是网页中某个特定的交互时刻 一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发 但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件 这些事件和浏览器创建的事件 ...

  5. Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件

    触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...

  6. Javascript高级编程学习笔记(68)—— 事件(12)设备事件

    设备事件 随着智能手机与平板电脑的普及,为了更好地让用户与这些设备进行交互 浏览器引入了一种新的方式,而一类新的事件也应运而生,这就是设备事件 W3C从2011年开始制定关于设备事件的草案 下面将会介 ...

  7. Javascript高级编程学习笔记(67)—— 事件(11)HTML5事件

    DOM规范没有涵盖所有浏览器支持的所有事件 而许多浏览器出于满足用户需求,或解决特殊问题的目的,实现了一些自定义事件 HTML5列出了浏览器应该支持的所有事件,这里只讨论得到浏览器完善支持的事件(并非 ...

  8. Javascript高级编程学习笔记(66)—— 事件(10)变动事件

    变动事件 DOM2级的变动事件,能在DOM中的一部分发生变化时给出提示 变动事件是为XML或HTML DOM 设计的,并不特定于某种语言 DOM2级定义了如下变动事件: DOMSubtreeModif ...

  9. Javascript高级编程学习笔记(65)—— 事件(9)复合事件

    复合事件 复合事件是 DOM3 中新增的一类事件,用于处理 IME 的输入序列 IME(输入法编辑器)通常用于输入物理键盘上找不到的字符,而这种输入方式通常需要同时按住多个键,但最终只输入一个字符 复 ...

随机推荐

  1. 监控服务器配置(一)-----Prometheus安装配置

    最近和朋友一起做的监控配置,拿出来共享一下 1.下载prometheus安装包(linux版)到 /opt/minitor/prometheus . 下载地址:https://download.csd ...

  2. 数据结构树之AVL树(平衡二叉树)

    一 什么是AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节 ...

  3. 机器学习之支持向量机(SVM)学习笔记

    支持向量机是一种二分类算法,算法目的是找到一个最佳超平面将属于不同种类的数据分隔开.当有新数据输入时,判断该数据在超平面的哪一侧,继而决定其类别. 具体实现思路: 训练过程即找到最佳的分隔超平面的过程 ...

  4. GUI学习之二——PyQt控件初识

    一.控件概念 控件是一个程序界面上的各个独立的元素, 它具备用户点击.接收用户输入.展示不同内容.存放其他控件等功能. 二.控件分类 常用的控件按功能可以分为以下几种类 按钮 QPushButton— ...

  5. java8 学习记录

    一.  lambda表达式 参考 https://www.cnblogs.com/franson-2016/p/5593080.html package com.mytest.java8; impor ...

  6. 浅谈 drop、truncate和delete的区别

    (1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作. TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独 ...

  7. shell逻辑运算总结, 包括[[]]与[]的区别,&&与-a的区别,||与-o的区别

    1. 关于文件和目录 -f  判断某普通文件是否存在 -d  判断某目录是否存在 -b  判断某文件是否块设备 -c  判断某文件是否字符设备 -S  判断某文件是否socket(待修正) -L  判 ...

  8. PLSQL账号密码

    Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769 password:xs374ca

  9. cookie存储

    cookie就是用来存储数据的 cookie先分装函数 这是用来存数据的函数 function setCookie(name,value,iDay){ if(iDay){ var oDate = ne ...

  10. Linux任务计划命令 :crontab -e

    crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond ...