005-事件捕获、冒泡&事件委托

事件捕获、冒泡&事件委托

1、事件捕获与冒泡

2、事件冒泡示例

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .parent {
        width: 300px;
        height: 200px;
        border: 1px solid #ccc;
        background: #f5f5f5;
      }
      .son {
        width: 100px;
        height: 100px;
        background: pink;
        text-align: center;
        line-height: 90px;
      }
    </style>
  </head>
  <body>
    <div class="parent">
      <div class="son">son</div>
    </div>
  </body>
  <script>
    const son = document.getElementsByClassName('son')[0];
    const parent = document.getElementsByClassName('parent')[0];
    son.onclick = function (e) {
      console.log('son click');
    };
    parent.onclick = function (e) {
      console.log('parent click');
    };
  </script>
</html>

当在页面触发 son 元素的点击事件时,因为事件冒泡,会依次打印 son click、parent click。

3、阻止事件冒泡

javascript 复制代码
const son = document.getElementsByClassName('son')[0];
const parent = document.getElementsByClassName('parent')[0];
son.onclick = function (e) {
  console.log('son click');
  e.stopPropagation();  // 阻止事件冒泡
};
parent.onclick = function (e) {
  console.log('parent click');
};

当在页面触发 son 元素的点击事件时,只会打印 son click。

4、阻止事件默认行为

💡 Tips:e.preventDefault() 或 return false 会阻止默认行为

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <a href="http://www.baidu.com">百度</a>
  </body>
  <script>
    const aDom = document.getElementsByTagName('a')[0];
    aDom.onclick = function (e) {
      console.log('a click');
      e.preventDefault(); // 阻止默认跳转
      // return false;  // 阻止默认跳转
    };
  </script>
</html>

5、事件委托

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
    </ul>
  </body>
  <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
  <script>
    // 将 li 的点击事件注册到 ul 上
    $('ul').on('click', 'li', function () {
      console.log(this); // <li>x</li>
    });
  </script>
</html>

6、事件委托优点

相关推荐
WeiXiao_Hyy28 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡1 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone1 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09011 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农1 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king2 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳2 小时前
JavaScript 的宏任务和微任务
javascript
夏幻灵3 小时前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星3 小时前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_3 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js