Javascript高级编程学习笔记(70)—— 事件(14)内存和性能
由于事件处理程序是现代的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)内存和性能的更多相关文章
- JavaScript高级程序设计学习笔记之事件
1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...
- Javascript高级编程学习笔记(57)—— 事件(1)事件流
事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...
- Javascript高级编程学习笔记(72)—— 模拟事件(2)IE事件模拟
IE中的事件模拟 低版本的IE浏览器作为前端开发的一股清流,想避过都不行 虽然低版本IE正在逐步被市场淘汰,不得不承认IE8以下的浏览器依然占了不小的份额 所以这里大概介绍IE8以下的低版本IE中的事 ...
- Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟
事件,指的是网页中某个特定的交互时刻 一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发 但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件 这些事件和浏览器创建的事件 ...
- Javascript高级编程学习笔记(69)—— 事件(13)触摸与手势事件
触摸与手势事件 由于移动设备既没有鼠标也没有键盘,所以在为移动浏览器开发交互性网页时,常规的鼠标键盘事件根本不够用 所以早期的苹果为Safari 添加了一些与触摸相关的事件 随着后面Android的W ...
- Javascript高级编程学习笔记(68)—— 事件(12)设备事件
设备事件 随着智能手机与平板电脑的普及,为了更好地让用户与这些设备进行交互 浏览器引入了一种新的方式,而一类新的事件也应运而生,这就是设备事件 W3C从2011年开始制定关于设备事件的草案 下面将会介 ...
- Javascript高级编程学习笔记(67)—— 事件(11)HTML5事件
DOM规范没有涵盖所有浏览器支持的所有事件 而许多浏览器出于满足用户需求,或解决特殊问题的目的,实现了一些自定义事件 HTML5列出了浏览器应该支持的所有事件,这里只讨论得到浏览器完善支持的事件(并非 ...
- Javascript高级编程学习笔记(66)—— 事件(10)变动事件
变动事件 DOM2级的变动事件,能在DOM中的一部分发生变化时给出提示 变动事件是为XML或HTML DOM 设计的,并不特定于某种语言 DOM2级定义了如下变动事件: DOMSubtreeModif ...
- Javascript高级编程学习笔记(65)—— 事件(9)复合事件
复合事件 复合事件是 DOM3 中新增的一类事件,用于处理 IME 的输入序列 IME(输入法编辑器)通常用于输入物理键盘上找不到的字符,而这种输入方式通常需要同时按住多个键,但最终只输入一个字符 复 ...
随机推荐
- 48-设置tomcat虚拟路径的两种方法(Eclipse、tomcat、IDEA)
设置tomcat虚拟路径的两种方法(Eclipse.tomcat.IDEA) 三种方式设置虚拟服务器路径如果我们要实现一个上传文件的功能,但是又想要上传的文件不会随着自己web服务器的重启而不能访问了 ...
- OkHttp的get和post请求
OkHttp的get.Post 由于没有看过书籍,不能将理论正确的描述出来,只能根据自己的理解,带大家认识下java开发下的OkHttp的get和post两种请求方式. 依赖的包为:okio-1.15 ...
- CentOS开机提示kernel panic - not syncing: Attempted to kill init! 解决方法
1.重新启动linux 系统,看见如图见面迅速按E键 2.看见如图界面在按E键编辑 3.如图界面使用上下键选择第二个在按E键 4.在最后一行后面添加 enforcing=0 按回车保存退出 5.在此 ...
- 一个c程序反汇编过程(zz)
zz from http://blog.luoyuanhang.com/ 最基本的反汇编方法是gdb xxx: disassemble main/其他函数 #反汇编一个简单的C程序并分析 C 源码: ...
- django添加控件
function bindRemoveCls() { $('#removeCls').click(function () { var options = $('#sel')[0].selectedOp ...
- 使用PYTHON完成排序(堆排序)
class HeapStructure: def __init__(self, ls): self.ls = ls def shift_up(self, index): # 上移使符合堆要求 if i ...
- Chapter5_初始化与清理_构造器初始化
一.构造器初始化的基本顺序 在使用构造器进行初始化时,最需要注意的是初始化的顺序,这种方法可以给初始化的顺序带来很大的灵活性.看如下的一个例子. class Window{ Window(int ma ...
- random模块,生成随机数
1.random.choice(sep) 从一个序列中随机选取一个元素返回 >>> list1=["a",1,2,3,"b"] >> ...
- 利用jsonp调用外部ip地址池
<html lang="en"> <head> <meta charset="UTF-8"> <title>Do ...
- Jmeter+ant集成接口测试报告
一.jdk1.8下载及环境配置 1.1 下载地址 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-download ...