用事件委托减少Dom元素的事件绑定
2017-10-18 21:00
204 查看
当我们需要为一个父元素下的所有子元素绑定事件的时候,我们通常条件下的做法,获取到父元素下的所有子元素,然后循环为所有的子元素绑定事件。但是当子元素的数量很多的时候,过多的绑定事件为影响到页面的性能,同时新增的子元素没有被绑定上事件,除非手动地在循环一次,为所有的元素在绑定上事件。这时候事件委托或者叫事件代理就派上用场了。
事件委托是利用了js事件冒泡的原理,当子元素的事件被触发时,父元素中具有相同事件也会被触发。(也就是我们直接为父元素添加事件即可)
我们先看一下为子元素绑定事件的传统的做法:
我们看一下事件委托的写法:
html结构:
script代码:
运行的结果是:当点击任意一个li的时候,就会将li的内容打印到控制台上。之后再点击按钮新增加一个元素,新元素同样也能打印出自身的内容。在前面的一种做法中,新增加的元素是不能触发事件的,除非为新增加的元素绑定事件。
上一个例子中我们的子元素都是li元素,他们所共同拥有的事件是一样的,当我们要绑定不同的事件的时候,应该怎么做呢?
我的做法是为他们加上不同的属性然后通过这个属性来区分不同的li元素,为他们添加上不同的事件。
代码如下:
运行的结果截图:
好了,事件委托的浅显分享就到这里了,如果文中有哪里解释得不好的地方,欢迎大家给我指出。
事件委托是利用了js事件冒泡的原理,当子元素的事件被触发时,父元素中具有相同事件也会被触发。(也就是我们直接为父元素添加事件即可)
我们先看一下为子元素绑定事件的传统的做法:
var oParent = document.getElementById( 'parent' ); var ele = oParent.getElementsByTagName( 'div' ); for ( var i = 0; i < ele.length; i++ ){ ele[i].index = i+1; ele[i].onclick = function(){ console.log( this.index ); } }
我们看一下事件委托的写法:
html结构:
<ul id="oul"> <li>11</li> <li>22</li> <li>33</li> <li>44</li> <li>55</li> </ul> <button id="button">添加</button> <!--测试新增加的元素中是否具有事件-->
script代码:
<script> var oUl = document.getElementById( 'oul' ); var oBtn = document.getElementById( 'button' ); oUl.onclick = function( ev ){ var event = ev || window.event; var target = event.target || event.srcElement; if ( target.nodeName.toLowerCase() == 'li' ){ 4000 console.log( target.innerText ); } } oBtn.onclick = function(){ var ele = document.createElement( 'li' ); ele.innerText = '新增的元素'; oUl.appendChild( ele ); } </script>
运行的结果是:当点击任意一个li的时候,就会将li的内容打印到控制台上。之后再点击按钮新增加一个元素,新元素同样也能打印出自身的内容。在前面的一种做法中,新增加的元素是不能触发事件的,除非为新增加的元素绑定事件。
上一个例子中我们的子元素都是li元素,他们所共同拥有的事件是一样的,当我们要绑定不同的事件的时候,应该怎么做呢?
我的做法是为他们加上不同的属性然后通过这个属性来区分不同的li元素,为他们添加上不同的事件。
代码如下:
oUl.onclick = function( ev ){ var event = ev || window.event; var target = event.target || event.srcElement; if ( target.nodeName.toLowerCase() == 'li' ){ var id = target.id; switch( id ){ case 'a' : console.log( '我是id为a的li元素' ); break; case 'c' : console.log( '我是id为c的li元素' ); break; default : console.log( '我们是没有id属性的元素,内容是:'+target.innerText ); } } }
运行的结果截图:
好了,事件委托的浅显分享就到这里了,如果文中有哪里解释得不好的地方,欢迎大家给我指出。
相关文章推荐
- js中的事件委托机制(解决动态生成的dom元素无法绑定事件的问题)
- 【JQuery】一个DOM元素,多次绑定同一事件的解决方案
- 工作积累(六)——jQuery实现DOM元素事件动态绑定
- jQuery检查DOM元素是否绑定某些事件
- 如何在通过knockout数据绑定的DOM元素上添加事件
- D 04_JS事件的两种绑定方式,元素绑定和DOM绑定
- 浏览器中开发人员工具快速找到dom元素绑定那些JS事件
- 解决给dom元素绑定click等事件无效问题的方法
- 一个DOM元素绑定多个事件时,先执行冒泡还是捕获
- 一个DOM元素绑定多个事件时,先执行冒泡还是捕获
- 【JS 设计模式 】门面模式之DOM元素绑定事件
- 动态生成dom元素时发生的重复绑定事件
- 为未出现的DOM元素绑定事件解决方案
- JQuery给动态生成的DOM元素绑定点击事件
- jQuery查看dom元素上绑定的事件列表
- 在jquery(1.7版)以及Ext(3.4版)中,查看在页面元素(domElement)上绑定的事件处理(listener、handler)
- js调试工具查看dom元素上绑定的事件列表
- JS实现对DOM元素事件的绑定
- Vue同一个dom元素如何绑定多个点击事件?
- 事件委托:给多个元素和动态添加的元素绑定js事件,