由于事件处理程序是现代的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. WebSocket 实现链接 群聊(low low low 版本)

    py 文件: """ 下载 gevent-websocket 0.10.1 基于Flask + geventWebSocket 建立连接,发送消息,实现群消息功能. &q ...

  2. vue element-ui 设置时间组件

    备注:设置开始时间小于结束时间 <!-- 开始时间 --> <div class="block"> <!-- <span class=" ...

  3. jQuery.validate.js 自定义错误信息

    var validate = $("form").validate({....})validate.showError({"username":"us ...

  4. docker不能上传镜像到自己网站的仓库

    错误提示如下: WARNING! Using --password via the CLI is insecure. Use --password-stdin. Error response from ...

  5. Learning to Promote Saliency Detectors

    Learning to Promote Saliency Detectors 原本放在了思否上, 但是公式支持不好, csdn广告太多, 在博客园/掘金上发一下 https://github.com/ ...

  6. 包管理工具-yarn

    今天知道了一个新的包管理工具叫yarn,总结如下: 如果你知道npm的使用过程,那么yarn你就觉着相见恨晚呐...... npm存在的问题: >安装的时候无法保证速度的一致性 >安全问题 ...

  7. [精华][推荐] CAS SSO单点登录环境搭建及实例

    1.因为是本地模拟sso环境,而sso的环境测试需要域名,所以需要虚拟几个域名出来,步骤如下: 2.进入目录C:\Windows\System32\drivers\etc 3.修改hosts文件 12 ...

  8. Eclipse 中 Maven 项目默认JDK版本为1.5 的解决方法

    在 Eclipse 中 Maven project 的默认 JDK 版本是 1.5, 如果不在 settings.xml 或者 pom.xml 中显示的指出 JDK 版本,每次 右键项目--> ...

  9. 服务管理之NFS

    目录 NFS简介 1.1 nfs特点 1.4 nfs的应用场景 4. nfs管理 NFS简介 1.1 nfs特点 NFS(Network File System)即网络文件系统,是FreeBSD支持的 ...

  10. ACM(图论)——tarjan算法详解

    ---恢复内容开始--- tarjan算法介绍: 一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法.通过变形,其亦可以求解无向图问题 桥: 割点: 连通分量: 适用问题: 求 ...