事件流
默认事件是按照一定的顺序进行传播的,这个传播顺序就是事件流
事件流模型:
- 捕获型事件流:事件的传播是从最不特定的事件目标到最特定的事件目标。
- 事件的传播是从最不特定的事件目标到最特定的事件目标。
事件有三个阶段:
1.捕获 2.目标阶段 3. 冒泡阶段
通过 e.eventPhase 来检测当前元素处于什么阶段
- 捕获 e.eventPhae=1;
- 目标阶段 e.eventPhae=2;
- 冒泡阶段 e.eventPhae=3;
事件对象的常见属性和方法
| 事件对象属性方法 | 说明 |
|---|---|
| e.target | 返回触发事件的对象 标准 |
| e.srcElement | 返回触发事件的对象 非标准 |
| e.type | 返回事件的类型 比如如 click mouseover 不带on |
| e.cancelBubble | 该属性阻止冒泡 非标准 |
| e.returnValue | 该属性 阻止默认事件(默认行为) 非标准 |
| e.preventDefault() | 该方法 阻止默认事件 (默认行为) 标准 |
| e.stopPropagation() | 阻止冒泡 标准 |
阻止事件冒泡
- 标准写法:利用事件对象里面的 stopPropagation()方法
e.stopPropagation()
- 非标准写法:IE 6-8 利用事件对象 cancelBubble 属性
e.cancelBubble = true
阻止事件冒泡的兼容性解决方案
if(e && e.stopPropagation){
e.stopPropagation();
}else{
window.event.cancelBubble = true;
}
事件委派
将子元素的事件委派给父元素执行
事件委派原理:事件冒泡
不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。
可以通过 e.target
-
判断内容:e.target.innText / e.target.innerHTML
-
判断类名:e.target.classList.contains("类名)
-
检测属性:e.target.classList.hasAttribute("属性名")
判断属性:e.target.classList.getAttribute("属性名")==“属性值”
-
判断标签名:e.target.nodenName==" 标签名大写 "
应用场景:
- 子元素过多并且需要给子元素设置事件的时候可以提高代码加载速度
- dom加载完后动态添加元素也需要同一事件处理程序的时候
- 我们只操作了一次 DOM ,提高了程序的性能