javascript – addEventListener中的useCapture行为奇怪
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – addEventListener中的useCapture行为奇怪,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2638字,纯文字阅读大概需要4分钟。
内容图文
![javascript – addEventListener中的useCapture行为奇怪](/upload/InfoBanner/zyjiaocheng/771/df7a9a91cc924f6aaf7ffd9e597859ba.jpg)
我试图理解JavaScript的addEventListener()中的useCapture参数.这是我的HTML:
<div id="wrapper">
<button id="button">Click me</button>
</div>
这是我的JavaScript:
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper capture'); }, true);
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper bubble'); }, false);
document.getElementById('button').addEventListener('click', function () { console.log('Button bubble'); }, false);
document.getElementById('button').addEventListener('click', function () { console.log('Button capture'); }, true);
现在,我预计订单将成为包装捕获,按钮捕获,按钮气泡,按钮气泡.令人惊讶的是,这是我的输出:
Wrapper capture
Button bubble
Button capture
Wrapper bubble
两个按钮处理程序正在混淆?我在其他浏览器中测试过,但Chrome,Firefox和IE10都显示相同的行为.我对此感到有点困惑. The MDN,QuirksMode.org和the spec都清楚地描述了不同的阶段以及捕获阶段如何在起泡阶段之前.为什么我的小实验导致在我的Button捕获之前调用Button泡泡处理程序?
这是一个关于正在发生的事情的小提琴:http://jsfiddle.net/Tr7G6/2
//更新
似乎附加处理程序的顺序很重要.
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper capture'); }, true);
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper bubble'); }, false);
document.getElementById('button').addEventListener('click', function () { console.log('Button capture'); }, true);
document.getElementById('button').addEventListener('click', function () { console.log('Button bubble'); }, false);
绑定到第一个捕获和第二个冒泡确实产生了我预期的输出,跨浏览器.但这很愚蠢.为什么这个订单很重要?
解决方法:
冒泡/捕获仅在事件冒泡/捕获到目标元素时相关,而不是直接在该元素上触发事件时(这是W3C事件模型的“目标阶段”).在没有“冒泡”或“捕获”的情况下 – 您的< button>上的点击事件就是这种情况. – 事件按添加顺序处理.
例如,如果要颠倒“包装器”上的侦听器顺序并单击包装元素(而不是按钮),您会注意到相同的行为(气泡会先触发):
// 1. "Wrapper Bubble" 2. "Wrapper Capture"
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper bubble'); }, false);
document.getElementById('wrapper').addEventListener('click', function () { console.log('Wrapper capture'); }, true);
但是,如果您使用相同的订单(捕获前的气泡)并单击按钮,捕获将在冒泡前触发.这是因为“按钮”事件在按钮上被触发,并且在“冒泡”(正常事件流)之前通过dom“捕获”.
我已经创建了一个JSBIN,希望有助于澄清这一点(但是,它可能会增加混乱). “ordered”按钮/ div触发第一个片段的顺序,“unordered”按钮和div使用你的第二个顺序.
有关其他信息,请参阅this SO答案和W3C Event Flow文档,特别是Target Phase.
内容总结
以上是互联网集市为您收集整理的javascript – addEventListener中的useCapture行为奇怪全部内容,希望文章能够帮你解决javascript – addEventListener中的useCapture行为奇怪所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。