天时地利的迷信~
各位宝宝,最近怎么样?北京的冬天来了,好冷,幸好下了一场不大不小的雪,否则对冬天真是喜欢不起来。
事件机制
事件触发三个阶段:
事件触发一般会按照?的顺序进行(W3C模型)
1. 先从上往下捕获 | | | / \ ------------------| |--| |-----------------| outer | | | | || -------------| |--| |----------- || | inner \ / | | | || | | | || | 2. 到达目标元素后从下往上冒泡 | || -------------------------------- || W3C event model |-------------------------------------------
但是有一个特例:如果给body中的子节点同时注册冒泡和捕获事件,事件触发会按照注册的顺序执行。
// 以下会先打印冒泡然后是捕获node.addEventListener( 'click', event => { console.log('冒泡') }, false)node.addEventListener( 'click', event => { console.log('捕获 ') }, true)
我们来看一下如下代码到底是怎么的结果:
var selector = document.querySelector.bind(document);selector('div.outer').addEventListener('click', (e) => { selector('p:first-of-type').textContent += 'outer clicked! '}, true)selector('div.inner').addEventListener('click', (e) => { selector('p:first-of-type').textContent += 'inner clicked! '}, false)document.addEventListener('click', (e) => { selector('p:first-of-type').textContent += 'document clicked! '}, true)
当点击innner元素时,如下元素发生了:
最后的结果是
// logdocument clicked! outer clicked! inner clicked!
我们把时间注册在冒泡阶段(addEventListener的useCapture选项为false)
var selector = document.querySelector.bind(document);selector('div.outer').addEventListener('click', (e) => { selector('p:first-of-type').textContent += 'outer clicked! ' console.log(e);}, false)selector('div.inner').addEventListener('click', (e) => { selector('p:first-of-type').textContent += 'inner clicked! ' console.log(e);}, false)document.addEventListener('click', (e) => { selector('p:first-of-type').textContent += 'document clicked! '}, false)
结果是:
// loginner clicked! outer clicked! document clicked!
愿我们有能力不向生活缴械投降---Lin
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有