事件冒泡和事件捕获

今天是2023年11月19日  天气晴

静下心来

最近感觉比较忙,但又不知道忙些什么,明明已经没参加什么活动,但还是感觉自己的事情很多,每天看着大一的进进出出,开始有点后悔自己在大一时没有多学点东西,到大二开始担心的事情逐渐比较多了,想着四级考试,想着专业课成绩,又想着每日的计划。感觉生活浑浑噩噩,现在发现不如早点放弃一些不值得焦虑的思考,比如专业课成绩,可以先慢慢学习老师在课堂上的知识,在集中时间解决不会的问题,零零碎碎的时间总是集中不了精神,不如就放空自己,集中精力做一件事。

事件委托和事件冒泡以及事件捕获

事件冒泡和事件捕获的区别

  • 事件捕获:事件从最外层的祖先元素向目标元素传播,然后在目标元素上触发。
  • 事件冒泡:事件从目标元素开始,向上传播至最外层的祖先元素,直至根节点。

事件冒泡

<div id="outer" style="padding: 20px; background-color: #eee;">
  <div id="middle" style="padding: 20px; background-color: #ccc;">
    <button id="inner">Click me!</button>
  </div>
</div>

给每个元素添加点击事件处理程序,并在控制台中输出它们的id: 

document.getElementById('outer').addEventListener('click', function() {
  console.log('Clicked outer');
});

document.getElementById('middle').addEventListener('click', function() {
  console.log('Clicked middle');
});

document.getElementById('inner').addEventListener('click', function() {
  console.log('Clicked inner');
});

点击 "Click me!" 按钮时,控制台上输出了以下内容:

Clicked inner
Clicked middle
Clicked outer

这就是事件冒泡的效果:点击最内层的按钮后,点击事件从按钮开始向上传播,首先触发按钮自身的点击事件处理程序,然后冒泡到包裹按钮的中间元素,再到最外层的外部元素。事件冒泡的过程只在最内层的按钮上添加了点击事件处理程序,但事件仍然会冒泡到它的父元素,直至根元素。

 事件捕获

还是以上述html代码为例,为其添加事件捕获

document.getElementById('outer').addEventListener('click', function() {
  console.log('Capturing outer');
}, true);

document.getElementById('middle').addEventListener('click', function() {
  console.log('Capturing middle');
}, true);

document.getElementById('inner').addEventListener('click', function() {
  console.log('Capturing inner');
}, true);

在添加事件监听器时传入了第三个参数 true,表示使用事件捕获

代码打印

Capturing outer
Capturing middle
Capturing inner

注意到输出的顺序是和事件捕获的传播方向相反的,即从最外层的祖先元素向目标元素传播。这就是事件捕获的过程:点击最内层的按钮后,事件会从最外层的祖先元素开始捕获,然后依次传播到目标元素

事件委托

事件委托是一种利用事件冒泡的机制,将事件处理程序添加到父元素而不是每个子元素上的技术。这样做有助于提高性能,并简化代码逻辑。

<ul id="myList">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
</ul>

使用事件委托,我们可以将点击事件处理程序添加到父元素上,并通过事件对象来判断用户实际点击的是哪个列表项

document.getElementById('myList').addEventListener('click', function(event) {
  if (event.target.tagName === 'LI') {
    console.log('Clicked on ' + event.target.textContent);
  }
});

只需将点击事件处理程序添加到父元素 ul 上,而不需要为每个列表项 li 单独添加处理程序。当用户点击列表项时,事件会冒泡至父元素 ul,然后通过事件对象的 target 属性来判断实际点击的是哪个列表项,从而执行相应的操作

事件委托可以减少事件处理程序的数量,提高性能,并且使代码更易于维护。

总结

事件冒泡和事件捕获都是为了解决在嵌套元素中处理事件的问题,它们可以根据实际需求选择使用。事件委托则是一种利用事件冒泡机制的技巧,可以简化代码并提高性能,在事件流中都有着重要作用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值