JavaScript事件冒泡与事件捕获

yizhihongxing

JavaScript事件冒泡与事件捕获是DOM的两种事件处理模型。事件处理模型规定了事件在DOM中的传播方式和触发顺序。

事件冒泡(Bubbling)

事件冒泡是DOM中事件的默认传播方式。子元素触发的事件会依次向父元素传递,直到传递到DOM树的根节点。

举个例子:

<div id="grandparent">
  <div id="parent">
    <div id="child"></div>
  </div>
</div>

<script>
  var grandparent = document.getElementById('grandparent');
  var parent = document.getElementById('parent');
  var child = document.getElementById('child');

  grandparent.addEventListener('click', function() {
    console.log('Grandparent clicked');
  });

  parent.addEventListener('click', function() {
    console.log('Parent clicked');
  });

  child.addEventListener('click', function() {
    console.log('Child clicked');
  });
</script>

假设我们点击 child 元素,事件将在 child 元素中被触发,然后向上传播到 parent 元素,接着传递到 grandparent 元素,最后到达 DOM 树的根节点。

事件捕获(Capturing)

事件捕获是另一种事件处理模型。与事件冒泡不同,事件捕获从DOM树的根节点开始触发,逐渐向下传递到具体的元素。

举个例子:

<div id="grandparent">
  <div id="parent">
    <div id="child"></div>
  </div>
</div>

<script>
  var grandparent = document.getElementById('grandparent');
  var parent = document.getElementById('parent');
  var child = document.getElementById('child');

  grandparent.addEventListener('click', function() {
    console.log('Grandparent clicked');
  }, true); // true 表示使用事件捕获模式

  parent.addEventListener('click', function() {
    console.log('Parent clicked');
  }, true);

  child.addEventListener('click', function() {
    console.log('Child clicked');
  }, true);
</script>

假设我们点击 child 元素,事件会从 DOM 树的根节点开始传播,依次传递到 grandparent 元素、parent 元素和 child 元素。

事件捕获与事件冒泡的结合使用

事件捕获和事件冒泡是可以同时存在的,但是他们执行的顺序是相反的。

举个例子:

<div id="grandparent">
  <div id="parent">
    <div id="child"></div>
  </div>
</div>

<script>
  var grandparent = document.getElementById('grandparent');
  var parent = document.getElementById('parent');
  var child = document.getElementById('child');

  grandparent.addEventListener('click', function() {
    console.log('Grandparent clicked in capture phase');
  }, true);

  parent.addEventListener('click', function() {
    console.log('Parent clicked in capture phase');
  }, true);

  child.addEventListener('click', function() {
    console.log('Child clicked in capture phase');
  }, true);

  grandparent.addEventListener('click', function() {
    console.log('Grandparent clicked in bubble phase');
  });

  parent.addEventListener('click', function() {
    console.log('Parent clicked in bubble phase');
  });

  child.addEventListener('click', function() {
    console.log('Child clicked in bubble phase');
  });
</script>

点击 child 元素后,事件会先在捕获阶段,从DOM树的根节点一直往下传递到 child 元素,并依次触发 grandparent、parent、child 元素的捕获事件。

接着,事件进入冒泡阶段,从 child 元素开始向上冒泡,依次触发 child、parent、grandparent 元素的冒泡事件。

总的来说,事件捕获和事件冒泡为开发者提供了丰富的事件处理方式,可以通过选择合适的方式来监听并处理事件,为页面交互提供更多效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript事件冒泡与事件捕获 - Python技术站

(0)
上一篇 2023年3月30日
下一篇 2023年3月20日

相关文章

  • jquery css 设置table的奇偶行背景色示例

    下面是详细讲解“jquery css 设置table的奇偶行背景色示例”的完整攻略: 示例1:使用:nth-child选择器 这种方法使用CSS3选择器中的 :nth-child()伪类选择器来实现。它可以选择某个元素的第 N 个子元素,而不管它是什么类型的元素。在这个示例中,我们可以使用odd和even关键字分别匹配奇数和偶数行,从而设置它们的背景颜色。 …

    css 2023年6月9日
    00
  • 详解html中background-image属性的设置

    关于HTML中background-image属性的设置,主要分为以下三个步骤: 1.准备背景图片 首先,在设置背景图片前,需要准备好需要设置的图片。可以使用自己的图片,也可以下载网络上的背景图片。需要注意的是,背景图片的格式应该是常见的图片格式之一(如jpg、png、gif等),大小要合适。 2.在样式表中设置background-image属性 接下来,…

    css 2023年6月9日
    00
  • JavaScript 事件冒泡简介及应用

    JavaScript 事件冒泡简介及应用 事件冒泡是指在 HTML 的 DOM 树结构中,当某个元素触发了一个事件后,它会向父元素逐层传递,直至到达文档根节点。这种事件传递方式被称为事件冒泡。 冒泡机制的触发方式 当一个元素触发一个事件时,事件将从触发元素开始,然后向上冒泡到它的父元素,父元素的父元素,依此类推,直到冒泡到文档中的根元素为止。整个过程称为事件…

    JavaScript 2023年6月10日
    00
  • 被忽视的META标签之特效(页面过渡效果)

    当我们在设计网站时,页面过渡效果常常为用户带来更好的体验感。在这里,我们将介绍一种通过设置meta标签来实现页面过渡效果的方法。下面将给出完整的攻略。 步骤一:在html头部添加meta标签 我们可以通过向html头部添加一个特殊的meta标签来定义我们期望的页面过渡效果。下面是meta标签的具体设置: <meta http-equiv="R…

    css 2023年6月11日
    00
  • JavaScript函数式编程(Functional Programming)声明式与命令式实例分析

    JavaScript函数式编程(Functional Programming)声明式与命令式实例分析 什么是函数式编程? 函数式编程(Functional Programming)是一种编程范式,其核心思想是用函数去组织代码,减少对于状态的依赖和改变,强调函数的纯粹性和不可变性,从而实现代码的简洁性、健壮性和可维护性。 声明式编程与命令式编程 命令式编程 命…

    JavaScript 2023年5月27日
    00
  • js简单网速测试方法完整实例

    JS简单网速测试方法完整实例攻略 什么是JS网速测试? 前端开发中,有时需要在页面中进行网速测试,来提高用户体验和网站性能。简单的JS测速方法有利于快速获取用户端网速信息。 JS简单网速测试方法 JS网速测试可以通过多种方法实现,以下是其中一种简单的实现方式。 1. 初始化定义 在JS文件中定义以下变量: let testImg, startTime, en…

    JavaScript 2023年6月10日
    00
  • php实现paypal 授权登录

    下面我给出详细的步骤和示例说明: 1. 注册PayPal商家账户 首先,你需要注册一个PayPal商家账户并登录。进入 https://developer.paypal.com/ ,点击右上角“Dashboard”,进入主页面,在“REST API apps”中创建一个新应用。在应用创建完成后,你可以从应用设置中获得API密钥。 2. 引入PayPal SD…

    JavaScript 2023年6月11日
    00
  • 通过CSS禁用页面内容选中和复制操作

    为了禁用页面内容选中和复制操作,我们可以采取以下两种方法: 1. 通过CSS的user-select属性来禁用选中操作 CSS的user-select属性可以控制用户是否可以选中页面中的文本,通过将其属性值设置为none可以禁用选中操作,代码如下: * { -webkit-user-select: none; /*webkit浏览器*/ -moz-user-…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部