element.addEventListener(event, function, useCapture)
capture 选项有两个可能的值:
如果为 false(默认值),则在冒泡阶段设置处理程序。
如果为 true,则在捕获阶段设置处理程序。
阻止事件冒泡
e.stopPropagation() //阻止事件冒泡
e.preventDefault( ) //阻止默认事件
dom事件传播事件的三个阶段
W3C
中定义事件的发⽣经历三个阶段:捕获阶段(>capturing
)、⽬标阶段 (>targetin
)、冒泡阶段( >bubbling
)
- 捕获阶段(Capturing phase)—— 事件(从 Window)向下走近元素。
- 目标阶段(Target phase)—— 事件到达目标元素。
冒泡阶段(Bubbling phase)—— 事件从元素上开始冒泡
冒泡型事件:当你使⽤事件冒泡时,⼦级元素先触发,⽗级元素后触发
- 捕获型事件:当你使⽤事件捕获时,⽗级元素先触发,⼦级元素后触发
DOM
事件流:同时⽀持两种事件模型:捕获型事件和冒泡型事件- 阻⽌冒泡:在
W3c
中,使⽤stopPropagation()
⽅法;在IE下设置cancelBubble =true
- 阻⽌捕获:阻⽌事件的默认⾏为,例如
click - a
后的跳转。在W3c
中,使⽤preventDefault()
⽅法,在 IE 下设置window.event.returnValue = false
每个处理程序都可以访问
event
对象的属性:冒泡和捕获为“事件委托”奠定了基础 —— 一种非常强大的事件处理模式
- 比如有一百个li标签,需求点击某一个的时候弹出对应的编号
- 可以直接给父级标签绑定事件,在冒泡的时候去弹出对应的下标。
document.getElementById("ul").addEventListener( "click", function (e) { console.log(e); e.view.confirm(e.target.dataset.index) }, false );
- 可以直接给父级标签绑定事件,在冒泡的时候去弹出对应的下标。