DOM事件模型
DOM 的事件操作(监听和触发),都定义在EventTarget接口。所有节点对象都部署了这个接口,其他一些需要事件通信的浏览器内置对象(比如,XMLHttpRequest、AudioNode、AudioContext)也部署了这个接
主要提供三个实例方法
addEventListener:绑定事件的监听函数removeEventListener:移除事件的监听函数dispatchEvent:触发事件
事件模型
一个事件发生后,会在子元素及父元素之间进行传播(propagation),这种传播分为三个阶段
-
- 由外向内找监听函,叫事件捕获
- 在目标节点触发事件
- 由内而外找监听函数,叫事件冒泡
通俗一点来说就是一个事件被触发时,浏览器会自动从用户操作标签外的最上级标签逐渐向里检查是否有相同事件,如果有则触发,如果没有则继续向下检查知道用户操作的标签,这过程称为捕获(捕获过程中有相同的监听的事件函数则执行),直到捕获到触发目标执行目标事件,然后向上检查直到最上级元素为止,此过程称为冒泡 (有监听函数就执行,并提供事件信息,没有就跳过)
DOM事件传播的三个阶段:捕获阶段,目标阶段,冒泡阶段
事件绑定API
IE5*:node.attachEvent('onclick',fn) //冒泡
网景:node.addEventListener('click',fn)//捕获
W3C: node。addEventListener('click',fn,bool)//
如果bool不传或为falsy
默认fn走冒泡,即当浏览器在冒泡阶段发现node有fn监听函数,就会调用fn,并提供事件信息
如果为true
就让fn走捕获,即当浏览器在捕获阶段发现node有fn监听函数,就会调用fn,并提供事件信息
代码示例
小结
-
捕获与冒泡
捕获说先调用爸爸的监听函数 冒泡说先调用儿子的监听函数 -
W3C事件模型
先捕获(先找爸爸=> 儿子)在冒泡(在儿子=>爸爸) 注意e对象被传给所有监听函数 事件结束后,e对象就不存在
取消冒泡
捕获不可以取消,但冒泡可以
e,stopPropagation()可中断冒泡,浏览器不在像上走
target vs currentTatget
区别
e.target:用户操作的元素
e.currentTarget: 程序员监听的元素
举例
div>span(文字),用户点击文字
e.target就是span
e.currentTarget就是div
不可阻止默认动作
有些事件不能阻止默认动作
MDN搜索scrollevent,看到Bubbles和Cancelable
Bubbles的意思是该事件是否冒泡,所有冒泡都可以取消
Cancelable的意思是开发者是否可以阻止默然事件
Cancelable与冒泡无关
如何阻止滚动
scroll事件不可以阻止默认动作
阻止scroll默认动作没用,以为有滚动才有滚动事件
要阻止滚动,可以阻止wheel和touchstart的默认动作
注意需要找准备滚动条所载的元素
但是滚动条还能用,可用css让滚动条width:0
css也行
使用overflow:hidden可以直接取消滚动条
但此时JS依然可以修改scrollTop
小结
target和currentTarget
一个是用户点击,一个是开发者监听
取消冒泡
e.stopPropagation()
事件的特性
Bubbles表示是否冒泡
Cancelable表示是否支持开发者取消冒泡
如scroll不支持取消冒泡
如何禁用滚动
取消特定元素的wheel和touchstart的默认动作