JavaScript基础教程 事件对内存和性能的影响
小作 2018-03-08 来源 :网络 阅读 813 评论 0

摘要:虽说事件处理程序可以为现代 Web 页面添加很强的交互能力,但是不分青红皂白就添加大量的事件处理程序绝对是一种愚蠢的行为。 这篇JavaScript基础教程来分析一下:事件处理程序本质上是一种函数,是一种对象,存放在内存中,设置大量的事件处理程序会使内存中的对象变多,Web 程序的性能会变得越来越差,用户体验很不好。 为了更好地利用好事件处理程序,便出现了事件委托,用来提升性能。

虽说事件处理程序可以为现代 Web 页面添加很强的交互能力,但是不分青红皂白就添加大量的事件处理程序绝对是一种愚蠢的行为。

这篇JavaScript基础教程来分析一下:事件处理程序本质上是一种函数,是一种对象,存放在内存中,设置大量的事件处理程序会使内存中的对象变多,Web 程序的性能会变得越来越差,用户体验很不好。

为了更好地利用好事件处理程序,便出现了事件委托,用来提升性能。

事件委托

事件委托(event delegation):把若干个子节点上的相同事件的处理函数绑定到它的父节点上去,在父节点上统一处理从子节点冒泡上来的事件,这种技术就叫做事件委托。

补充一下:事件委托并不局限于父节点与子节点之间。也可以这样玩,比如页面文档中有好多个处在不同位置地 button,都是绑定 click 事件,使用事件委托,我们可以把这些个事件统一绑定到 body 元素,然后再进行处理(虽然一般很少这么用)。

下面举例子逐步说明事件委托的优势:

<ul id="parent-list">

    <li id="list-1">List 1</li>

    <li id="list-2">List 2</li>

    <li id="list-3">List 3</li>

    <li id="list-4">List 4</li>

    <li id="list-5">List 5</li></ul>

假设有上面的代码,我们现在有一个需求:就是无论单击上面的列表(ul)的哪个子列表(li),都会弹出一个框,来显示我们点击了哪个子列表。

需求不难吧?有了需求,接下来是该写 js 代码了,现在有两种方法放在你眼前:1. 为每个 li 子元素绑定 click 事件,然后设置处理函数; 2. 利用事件委托,为 ul 父元素绑定 click 事件,然后设置处理函数

// 方法一var list1 = document.getElementById("list-1");

list1.addEventListener("click",function(){

  alert(this.firstChild.nodeValue);

},false);var list2 = document.getElementById("list-2");

list2.addEventListener("click", function() {

  alert(this.firstChild.nodeValue);

}, false);var list3 = document.getElementById("list-3");

list3.addEventListener("click", function() {

  alert(this.firstChild.nodeValue);

}, false);var list4 = document.getElementById("list-4");

list4.addEventListener("click", function() {

  alert(this.firstChild.nodeValue);

}, false);var list5 = document.getElementById("list-5");

list5.addEventListener("click", function() {

  alert(this.firstChild.nodeValue);

}, false);

// 方法二var parentList = document.getElementById("parent-list");

parentList.addEventListener("click",function(){

  var target = event.target;

  if(target.nodeName.toLowerCase() === "li"){

    alert(target.firstChild.nodeValue);

  }

},false);

看着上面的代码,我这里写几点方法二的优点:1. 减少了访问 DOM 的次数,提升了性能;2. 将子元素的事件处理程序统一绑定到其父元素,减少了对内存的占用;3. 可以更好地管理事件处理程序,比如移除对某个事件处理程序的引用

注意:如果对各个子元素的需求不一样,我们还可以这样来改写上面的方法二:

// 方法二var parentList = document.getElementById("parent-list");

parentList.addEventListener("click",function(){

  var target = event.target;

  if(target.nodeName.toLowerCase() === "li"){

    switch(target.id){

      case "list-1":

        alert("学的越多,越觉得自己无知!");

        break;

      case "list-2":

        alert("爱是一种艺术!");

        break;

      case "list-3":

        target.innerHTML = "呵呵,我改了啊!";

        break;

      case "list-4":

        target.style.background = "#aaa";

        break;

      case "list-5":

        target.style.color = "red";

        target.style.fontSize = "2em";

        break;

      default:

        break;

    }

  }

},false);

因为事件委托依赖事件冒泡机制,所以,并不是所有的事件都可以进行事件委托。

最适合采用事件委托的事件包括:click、mousedown、mouseup、keydown、keyup 和 keypress。

事件委托只是一种非常不错的事件绑定的思想,所以不应该拘泥于上面的例子,要活学活用! ^_^

移除事件处理程序

我们前面说过,事件处理程序存在于内存中,每当将事件处理程序指定给元素时,运行中的浏览器代码与支持页面交互的 JavaScript 代码之间就会建立一个连接。这种连接越多,页面执行就越慢。前面所说的事件委托就是用来限制建立的连接数量。

还有,就是内存中那些使用完后不再使用的事件处理程序,如果不释放掉,也会影响 Web 应用程序的内存和性能。

<button id="button">提交</button>var button = document.getElementById("button");

button.onclick = function(){

  // 提交某个表单的操作代码

 

  button.onclick = null; // 移除事件处理程序

  event.target.firstChild.nodeValue = "提交中。。。";

};

总的原则就是:移除掉那些过时不再使用的事件处理程序,释放内存!

希望这篇文章可以帮助到你。总之,同学们,你想要的职坐标IT频道都能找到!

 


本文由 @小作 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程