详解事件冒泡和捕获
来源:互联网 发布:mysql索引原理 编辑:程序博客网 时间:2024/05/10 19:26
事件的三个阶段
捕获 -> 目标 -> 冒泡
捕获(IE8及以下版本不支持),目标,冒泡 捕获阶段给事件截获提供了可行性。
三种模型
捕获型事件:即事件的发生过程是从最不具体的元素到最具体的元素Netscape 支持捕获型。
冒泡型事件:即事件的发生过程是从最具体的元素到最不具体的元素,IE 则支持冒泡型。
w3c 模型:首是进入捕获阶段,直到达到目标元素,再进入冒泡阶段。
统一事件的发生过程
支持 W3C 标准的浏览器在添加事件时用addEventListener(event,fn,useCapture)
方法,基中第 3 个参数useCapture
是一个 Boolean
值,用来设置事件是在事件捕获时执行,还是事件冒泡时执行。而不兼容 W3C 的浏览器 (IE) 用attachEvent()
方法,此方法没有相关设置,不过 IE 的事件模型默认是在事件冒泡时执行的,也就是在 useCapture
等于 false
的时候执行,所以把在处理事件时把 useCapture
设置为 false
是比较安全,也实现兼容浏览器的效果。
在微软的模型中,你必须设置事件的 cancelBubble 的属性为 true
window.event.cancelBubble = true
在 w3c 模型中你必须调用事件的 stopPropagation() 方法
e.stopPropagation()
这会阻止所有冒泡向外传播。而作为跨浏览器解决方案应该这么作:
function doSomething(e){ if (!e) var e = window.event; e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();}
currentTarget
一个事件用 target 或者是 srcElement 属性用来表示事件究竟发生在哪个目标元素上(即用户最初点击的元素)。非常重要的是,要明白在捕获或者冒泡阶段的目标元素是不变的。
currentTarget 这个属性,它就指向正在处理事件的元素:这恰是我们需要的。很不幸的是微软模型中并没有相似的属性
你也可以使用”this”关键字。在上面的例子中,它相当于正在处理事件的 html 元素,就像 currentTarget。
微软模型的问题
但是当你使用微软事件绑定模型时,this 关键字并不相当于 HTML 元素。联想缺少类似 currentTarget 属性的微软模型。
你无法确切知道哪一个 HTML 元素正在负责处理事件,这是微软事件绑定模型最严重的问题,对我来说,这也是我从不使用它的原因,哪怕是在开发仅供 Windows 下的 IE 的应用程序
我希望能够尽快增加 currentTarget 类似的属性——或者遵循标准 web 开发者们需要这些信息。
参考文献:js之事件冒泡和事件捕获详细介绍&生动详细解释javascript的冒泡和捕获&理解捕获,目标,冒泡三个阶段
- 详解事件冒泡和捕获
- JS事件冒泡和事件捕获详解
- js事件冒泡和事件捕获详解
- js:事件冒泡和时间捕获详解
- js事件冒泡、事件捕获和阻止默认事件详解
- 冒泡和事件捕获
- 事件捕获和冒泡
- 事件捕获和冒泡
- 事件冒泡和捕获
- 冒泡事件和捕获事件以及阻止冒泡和捕获方法的详解
- (标记)javascript事件冒泡和事件捕获详解
- 事件冒泡和事件捕获
- 事件冒泡和事件捕获
- 事件捕获和事件冒泡
- 事件冒泡和事件捕获
- 事件冒泡和事件捕获
- 事件冒泡和事件捕获
- 事件冒泡和事件捕获
- AudioPolicyService源码分析
- 树形dp小练
- 有序顺序表归并
- 抽象类和接口
- ArrayList与迭代器模式
- 详解事件冒泡和捕获
- mysql更新死锁
- 有序顺序表查询(二分查找)
- linux下解决bash: syntax error near unexpected token `(' 的错误
- 四旋翼飞行器姿态解算算法入门视频教程
- OpenGL超级宝典学习笔记——操作矩阵
- 【Android
- HDU 3999----The order of a Tree(二叉树的前序遍历)
- ArrayList源码分析