- DOM事件三阶段:
- window 往事件触发处传播,遇到注册的捕获事件会触发
- 传播到事件触发处时触发注册的事件
- 从事件触发处往 window 传播,遇到注册的冒泡事件会触发
例外:同时注册冒泡和捕获事件时,会按注册的顺序执行
-
标准事件监听
elem.addEventListener(type, handler, capture)/elem.removeEventListener(type, handler, capture)
handler接收保存事件信息的event对象作为参数;
event.target为触发事件的对象,handler调用上下文this为绑定监听器的对象
event.preventDefault():取消事件默认行为
event.stopPropagation():阻止事件冒泡/捕获事件,即阻止事件的传递
event.stopImmediatePropagation():取消事件传递&阻止该注册目标再去注册别的事件第三个参数:可以是布尔值或者对象,布尔值:false-冒泡,true-捕获
对象:capture,once(boolean):true-该事件回调调用一次,passive(Boolean):永远不会调用stopPropagation -
老版本IE事件监听elem.attachEvent('on'+type, handler)/elem.detachEvent('on'+type, handler):handler不接收event作为参数,事件信息保存在window.event中,触发事件的对象为event.srcElement,handler执行上下文this为window使用闭包中调用handler.call(elem, event)可模仿标准模型,然后返回闭包,保证了监听器的移除。event.returnValue为false时取消事件默认行为,event.cancleBubble为true时取消时间传播
-
通常利用事件冒泡机制,事件委托处理程序提高程序性能。
事件委托
通俗地讲就是将事件绑定到元素的父元素上,通过event.target去获取目标。
比如一个列表元素,每一个li标签都会触发同一类事件,那么,通常的做法是在每一个li上都绑定一个触发事件,点到那个就完成对应的回调。然而这种做法很浪费内存。
vue中,可以利用冒泡的机制,在其父元素,也就是ul上绑定一个公共事件,传入一个 $event
参数。当点击某个li标签时,可以通过e.target获取目标。
- 节省内存
- 不需要给子节点注销事件
网友评论