js事件机制

先上一张经典的js事件捕获和冒泡图

在这里插入图片描述

举个例子

<div id="box1">
    box1
  <div id="box2">box2</div>
</div>
window.addEventListener(
  'click',
  () => {
    console.log('window 冒泡');
  },
  false
);
window.addEventListener(
  'click',
  () => {
    console.log('window 捕获');
  },
  true
);
document.addEventListener(
  'click',
  () => {
    console.log('document 冒泡');
  },
  false
);
document.addEventListener(
  'click',
  () => {
    console.log('document 捕获');
  },
  true
);
document.documentElement.addEventListener(
  'click',
  () => {
    console.log('html 冒泡');
  },
  false
);
document.documentElement.addEventListener(
  'click',
  () => {
    console.log('html 捕获');
  },
  true
);
document.body.addEventListener(
  'click',
  () => {
    console.log('body 捕获');
  },
  true
);
document.body.addEventListener(
  'click',
  () => {
    console.log('body 冒泡');
  },
  false
);
const box1 = document.getElementById('box1');
const box2 = document.getElementById('box2');
box1.addEventListener(
  'click',
  () => {
    console.log('box1 冒泡');
  },
  false
);
box1.addEventListener(
  'click',
  () => {
    console.log('box1 捕获');
  },
  true
);
box2.addEventListener(
  'click',
  () => {
    console.log('box2 冒泡');
  },
  false
);
box2.addEventListener(
  'click',
  () => {
    console.log('box2 捕获');
  },
  true
);

点击box2输出如下

//window 捕获
//document 捕获
//html 捕获
//body 捕获
//box1 捕获
//box2 冒泡
//box2 捕获
//box1 冒泡
//body 冒泡
//html 冒泡
//document 冒泡
//window 冒泡

点击box2,click事件先沿着window->document->html->body->box1->box2捕获前进,在捕获过程中执行相应的函数。

到达box2后,则按照事件绑定顺序执行函数。由于在box2上绑定的冒泡事件先于捕获事件,所以先执行冒泡事件上的函数。

在box2上的函数执行完后,click事件沿着box2->box1->body->html->document->window冒泡前进。

但是,不是所有的事件都像上面那样,有的事件就不支持冒泡,例如:

  • 鼠标事件(mouseleavemouseenter
  • 焦点事件(blurfocus
  • UI事件(loadunloadscrollresize

可以用Event.bubbles这个只读布尔值判断事件是否支持冒泡

  • 焦点事件(blurfocus
  • UI事件(loadunloadscrollresize

可以用Event.bubbles这个只读布尔值判断事件是否支持冒泡

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值