当前位置:首页 > 日记 > 正文

JavaScript 事件对内存和性能的影响

JavaScript 事件对内存和性能的影响

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

我们来分析一下:事件处理程序本质上是一种函数,是一种对象,存放在内存中,设置大量的事件处理程序会使内存中的对象变多,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 = "提交中。。。";};

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!

相关文章

excel 使用公式进行文本拼接的方法

excel 使用公式进行文本拼接的方法

方法,文本,公式,电脑软件,excel,  在Excel中经常需要用到公式把文本拼接起来,具体怎么做呢?接下来是小编为大家带来的excel 使用公式进行文本拼接的方法,供大家参考。excel 使用公式进行文本拼接的方法文本拼接步骤1:Excel 2013 单元格字符…

详解基于 axios 的 Vue 项目 http

详解基于 axios 的 Vue 项目 http

请求,优化,项目,详解,电脑软件,对于需要大量使用 http 请求的项目,我们通常会选择对 http 请求的方法进行二次封装,以便增加统一的拦截器,或者统一处理阻止重复提交之类的逻辑。Vue.js 的项目中我们选择使用了 axios 这样一个 http 库,下面也就…

WPS2016怎么样制作堆积柱形图图表

WPS2016怎么样制作堆积柱形图图表

图图,电脑软件,  WPS2016编辑文件的时候,想要插入图表,这就需要设计一个图表。以下是小编为您带来的关于WPS2016制作堆积柱形图图表,希望对您有所帮助。WPS2016制作堆积柱形图图表1、打开【WPS】软件。2、点击【WPS】文字下拉框中的新建,新建…

WPS表格如何添加漂亮的边框和底纹

WPS表格如何添加漂亮的边框和底纹

边框,底纹,表格,漂亮,电脑软件,  WPS表格有很多样式,可以随意的添加边框和底纹,wps中的表格想要制作成更漂亮的效果,就需要添加一些底纹和边框效果。以下是小编为您带来的关于WPS表格添加漂亮的边框和底纹,希望对您有所帮助。WPS表格添加漂亮…

Word中2010版进行为标题段文字添加

Word中2010版进行为标题段文字添加

边框,文字,操作技巧,标题,操作步骤,  在word2010中如何为标题段文字添加阴影边框,具体该怎么去进行操作的呢?今天,小编就教大家在Word中2010版进行为标题段文字添加阴影边框的操作技巧。Word中2010版进行为标题段文字添加阴影边框的操作步…

ppt2013加页码不显示的解决方法

ppt2013加页码不显示的解决方法

解决方法,显示,页码,电脑软件,strong,  ppt2013是一款十分普遍地幻灯片编辑的软件。有时我们编辑的量太大,页数太多,需要插入页码但是不显示怎么办?下面给大家分享PPT页面不显示的解决方法。ppt2013加页码不显示的解决方法步骤1在编辑框中&…

轻松学习Javascript闭包

轻松学习Javascript闭包

闭包,学习,轻松,电脑软件,Javascript,闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。当function里嵌套function时,内部的function可以访问外部function里的变量。function foo(x) { var tmp = 3; functi…

qq安全中心手机密保解绑操作方法

qq安全中心手机密保解绑操作方法

安全中心,操作方法,方法,机密,电脑软件,  关于手机密保如何解绑问题,在此先表示遗憾,因为目前QQ已经不支持解绑功能,因而也不要怀疑为什么找不到&ldquo;解绑&rdquo;按钮。但如果是手机更换或者丢失,那么可以通过更换密保手机实现,今天小编给你…

Word文档插入GIF动态的方法是什么

Word文档插入GIF动态的方法是什么

文档,方法,动态,动态图片,电脑软件,  正常情况下word可以插入GIF动画,但是插入的GIF动态图片不会动。那么在Word文档中,应该如何插入动态的图片。以下是小编为您带来的关于Word文档插入GIF动态图片,希望对您有所帮助。Word文档插入GIF动态图…

ppt怎么制作触发器ppt制作触发器的

ppt怎么制作触发器ppt制作触发器的

触发器,步骤,方法,电脑软件,ppt,  PPT触发器是PowerPoint中的一项功能,它可以是一个图片、文字、段落、文本框等,相当于是一个按钮,在PPT中设置好触发器功能后,点击触发器会触发一个操作,该操作可以是多媒体音乐、影片、动画等。那么小面小编…

excel2010调出数据分析的方法excel

excel2010调出数据分析的方法excel

数据分析,方法,电脑软件,strong,  在Excel中录入数据后经常需要对数据进行分析,因此数据分析这个功能很重要,接下来是小编为大家带来的excel2010调出数据分析的方法,供大家参考。excel2010调出数据分析的方法excel2010调出数据分析的方法图1…

word2007模板路径在哪word2007模板

word2007模板路径在哪word2007模板

路径,模板,位置,具体位置,电脑软件,  word模板路径怎么找,最近用word比较多,我用word打开文件的时候,提示说文件错误,后来查资料需要删除word模板文件才能解决这格问题。那么下面小编就教你word2007模板路径在哪。word2007模板路径的位置打开…