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(输入法编辑器)通常用于输入物理键盘上找不到的字符,而这种输入方式通常需要同时按住多个键,但最终只输入一个字符 复 ...
随机推荐
- 8.Redis内存分配
8.Redis内存分配8.1 内存消耗8.1.1 内存使用统计8.1.2 内存消耗划分8.1.3 子进程内存消耗8.2 内存管理8.2.1 设置内存上限8.2.2 动态调整内存上限8.2.3 内存回收 ...
- Mybatis order by语句使用<Choose><When>动态拼装无效的原因及解决方法
在使用 <choose> <when test=""> </when> <otherwise> </otherwise> ...
- SqlServer数据库链接字符串
完整链接字符串: 1."DataSourse=.\你的实例;Initial Catalog=yourdatabase;User ID=*;Password=*;Trusted_Connect ...
- 常用JSON接口
地图接口阿里云根据地区名获取经纬度接口http://gc.ditu.aliyun.com/geocoding?a=苏州市 官方文档参数解释: 纬度,经度 type 001 (100代表道路,010代表 ...
- H5采集pcm流转换采样率实时发送到服务端
function startTalk(ws2, button) { var arrBuffer = new ArrayBuffer(320 * 2); var sendBuffer = new Dat ...
- python 环境变量设置PYTHONPATH
PYTHONPATH是Python搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找. 打印PYTHONPATH: import os print sys.path >['' ...
- 微信小程序的自定义插件
第一步,创建一个页面和普通页面一样 第二不,在这个页面上进行对json配置, "component":true 第三不在需要插入的页面中进行设置 插入标签 <dialog i ...
- [Java源码解析] -- String类的compareTo(String otherString)方法的源码解析
String类下的compareTo(String otherString)方法的源码解析 一. 前言 近日研究了一下String类的一些方法, 通过查看源码, 对一些常用的方法也有了更透彻的认识, ...
- mycat跟踪分析
mycat版本1.6 192.168.5.66 从 192.168.5.67主 一个user表 验证主从 log4j2修改日志level为debug schema.xml配置 启动服务,打开日志tai ...
- JSON.parse()——Uncaught SyntaxError: Unexpected token \ in JSON at position 1
背景:项目安全处理方面之一 ——对特殊字符进行编解码(后端编码,前端解码) 特殊字符: " %22 \ %5C / %2F & %26 % %25 ' ...