title: 41-事件委托 publish: true
事件委托 事件委托,通俗地来讲,就是把一个元素响应事件(click、keydown……)的函数委托到另一个元素。
比如说有一个列表 ul,列表之中有大量的列表项 <a>
标签:
<ul id ="parent-list" > <li > <a href ="javascript:;" class ="my_link" > 超链接一</a > </li > <li > <a href ="javascript:;" class ="my_link" > 超链接二</a > </li > <li > <a href ="javascript:;" class ="my_link" > 超链接三</a > </li > </ul >
当我们的鼠标移到<a>
标签上的时候,需要获取此<a>
的相关信息并飘出悬浮窗以显示详细信息,或者当某个<a>
被点击的时候需要触发相应的处理事件。我们通常的写法,是为每个<a>
都绑定类似onMouseOver或者onClick之类的事件监听:
window .onload = function ( ){ var parentNode = document .getElementById ("parent-list" ); var aNodes = parentNode.getElementByTagName ("a" ); for (var i=0 , l = aNodes.length ; i < l; i++){ aNodes[i].onclick = function ( ) { console .log ('我是超链接 a 的单击相应函数' ); } } }
但是,上面的做法过于消耗内存和性能。我们希望,只绑定一次事件,即可应用到多个元素上 ,即使元素是后来添加的。
因此,比较好的方法就是把这个点击事件绑定到他的父层,也就是 ul
上,然后在执行事件函数的时候再去匹配判断目标元素。如下:
<!DOCTYPE html > <html > <head > <meta charset ="utf-8" /> <title > </title > <script type ="text/javascript" > window .onload = function ( ) { document .getElementById ('parent-list' ).addEventListener ('click' , function (event ) { event = event || window .event ; if (event.target && event.target .className == 'link' ) { console .log ('我是ul的单击响应函数' ); } }, false ); }; </script > </head > <body > <ul id ="parent-list" style ="background-color: #bfa;" > <li > <p > 我是p元素</p > </li > <li > <a href ="javascript:;" class ="link" > 超链接一</a > </li > <li > <a href ="javascript:;" class ="link" > 超链接二</a > </li > <li > <a href ="javascript:;" class ="link" > 超链接三</a > </li > </ul > </body >
上方代码,为父节点注册 click 事件,当子节点被点击的时候,click事件会从子节点开始向父节点冒泡 。父节点捕获到事件 之后,开始执行方法体里的内容:通过判断 event.target 拿到了被点击的子节点<a>
。从而可以获取到相应的信息,并作处理。
换而言之,参数为false,说明事件是在冒泡阶段触发(子元素向父元素传递事件)。而父节点注册了事件函数,子节点没有注册事件函数,此时,会在父节点中执行函数体里的代码。
总结 :事件委托是利用了冒泡机制,减少了事件绑定的次数,减少内存消耗,提高性能。
事件委托的参考链接:
我的公众号 想学习更多技能 ?不妨关注我的微信公众号:千古壹号 (id:qianguyihao
)。
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外: