事件流描述的是从页面中接收事件的顺序
IE的事件流是事件冒泡
而 Netscape Communicator的事件流是事件捕获流
DOM2级事件规定的事件流包括三个阶段:
事件捕获阶段
处于目标阶段
事件冒泡阶段
⾸先发⽣的是事件捕获,为截获事件提供了机会。
然后是实际的⽬标接收到事件。
最后⼀个阶段是冒泡阶段,可以在这个阶段对事件做出响应
1、当处于⽬标阶段,没有捕获与冒泡之分,执⾏顺序会按照 addEventListener 的添加顺序决定,
先添加先执⾏;
2、使⽤ stopPropagation() 取消事件传播时,事件不会被传播给下⼀个节点,但是,同⼀节点上
的其他listener还是会被执⾏;如果想要同⼀层级的listener也不执⾏,可以使⽤ stopImmediateProp
agation()
3、 preventDefault() 只是阻⽌默认⾏为,跟JS的事件传播⼀点关系都没有;
4、⼀旦发起了 preventDefault() ,在之后传递下去的事件⾥⾯也会有效果;
事件对象
DOM0和DOM2的事件处理程序都会⾃动传⼊event对象
IE中的event对象取决于指定的事件处理程序的⽅法。
IE的handler会在全局作⽤域运⾏, this === window ,所以在IE中会有 window.event 、 even
t 两种情况,只有在事件处理程序期间,event对象才会存在,⼀旦事件处理程序执⾏完成,event对象
就会被销毁
event对象⾥需要关⼼的两个属性:
1. target:target永远是被添加了事件的那个元素;
2. eventPhase:调⽤事件处理程序的阶段,有三个值
1:捕获阶段;
2:处于⽬标;
3:冒泡阶段
preventDefault与stopPropagation
preventDefault:⽐如链接被点击会导航到其href指定的URL,这个就是默认⾏为;
stopPropagation:⽴即停⽌事件在DOM层次中的传播,包括捕获和冒泡事件;
IE中对应的属性:
srcElement => target
returnValue => preventDefault()
cancelBubble => stopPropagation()
IE 不⽀持事件捕获,因⽽只能取消事件冒泡,但 stopPropagation 可以同时取消事件捕获和冒泡。
再针对上⾯不同类型的事件及属性进⾏区分:
事件委托
如果在⼀个复杂的 Web 应⽤程序中,对所有可单击的元素都采⽤这种⽅式,那么结果就会有数不 清的
代码⽤于添加事件处理程序。此时,可以利⽤事件委托技术解决这个问题。使⽤事件委托,只需在
DOM 树中尽量最⾼的层次上添加⼀个事件处理程序。
最适合采⽤事件委托技术的事件包括 click 、 mousedown 、 mouseup 、 keydown 、 keyup
和 keypress 。 虽然 mouseover 和 mouseout 事件也冒泡,但要适当处理它们并不容易,⽽
且经常需要计算元素的位置。
可以考虑为 document 对象添加⼀个事件处理程序,⽤以处理⻚⾯上发⽣的某种特定类型的事件,需要
跟踪的事件处理程序越少,移除它们就越容易(移除事件处理程序关乎内存和性能)。
只要是通过 onload 事件处理程序添加的东⻄,最后都要通过 onunload 事件处理程序将它们移
除。