JavaScript事件冒泡与事件捕获

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日
下一篇 2024年10月28日

相关文章

  • javascript实现简单页面倒计时

    下面是关于“javascript实现简单页面倒计时”的完整攻略。 1. 倒计时的基本概念 倒计时(Countdown)是指从一个固定时间向后计数,时间到了则触发一些既定事件的过程。在网页开发中,常见的用途包括限时抢购、秒杀活动、节假日倒计时等。 2. 倒计时的实现步骤 实现一个简单的倒计时,需要进行以下几个步骤: 2.1 计算时间差 首先,我们需要确定两个固…

    JavaScript 2023年5月27日
    00
  • selenium+python自动化测试之页面元素定位

    本文将详细讲解如何使用selenium和python实现自动化测试中的页面元素定位。 什么是selenium Selenium是一个基于浏览器的自动化测试工具,可以模拟人类对网站的操作,用于自动化测试。Selenium支持多种语言,包括python,因为其易学易用、功能强大,成为自动化测试的首选语言。 Selenium+Python实现页面元素定位的方法 页…

    css 2023年6月10日
    00
  • JQuery为元素添加样式的实现方法

    以下是详细讲解“JQuery为元素添加样式的实现方法”的完整攻略。 一、使用JQuery的css()方法 JQuery的css()方法可以为元素添加CSS样式,其语法如下: $(selector).css(property, value) 其中,selector表示要添加CSS样式的元素的选择器,property表示要添加的CSS属性,value表示对应CS…

    css 2023年6月10日
    00
  • JavaScript中将值转换为字符串的五种方法总结

    我将为您详细讲解JavaScript中将值转换为字符串的五种方法总结。 方法一:使用toString()方法将值转换为字符串 所有的JavaScript数据类型都具有toString()方法来转换为字符串。这种方法是最常用的将值转换为字符串的方法。 示例: var num = 10; var str = num.toString(); console.log…

    JavaScript 2023年5月28日
    00
  • JavaScript 有用的代码片段和 trick

    当提到 JavaScript 有用的代码片段和 trick 时,我们通常指的是 JavaScript 开发者经常用到的一些技巧和代码片段。这些技巧和代码片段可以帮助我们更好地优化我们的代码并增强我们的开发能力。以下是一些实用的技巧和代码片段: 1. JavaScript 中的链式调用 链式调用是一种使代码更加紧凑、易于读取的技巧。它允许我们在一个方法的输出上…

    JavaScript 2023年6月10日
    00
  • JavaScript数组filter方法

    当在JavaScript中使用数组时,有时我们需要从数组中筛选出符合条件的数据。这时可以使用数组的filter()方法。本文将介绍如何使用filter()方法以及一些示例。 基本语法 filter()方法的基本语法如下: array.filter(function(currentValue[, index[, array]]) { // 定义规则 }); 其…

    JavaScript 2023年5月27日
    00
  • 简单的二级菜单导航实现css代码

    我来为你详细讲解如何实现简单的二级菜单导航的 CSS 代码。 一、HTML 结构 首先要确定好导航的 HTML 结构。在本次攻略中,我们将使用一个无序列表 <ul> 来构建导航栏。每个一级菜单都是一个 <li> 元素,并包含一个链接,同时如果有子菜单,则需要在该 <li> 元素中嵌套一个新的 <ul> 列表用于…

    css 2023年6月10日
    00
  • 学习DIV+CSS网页布局之两列布局

    学习DIV+CSS网页布局之两列布局可以分为以下几步进行: 步骤一:创建HTML结构 首先,需要创建一个基本的HTML结构。在这个结构中,我们将会用到两个DIV元素。一个用于头部,另一个用于主体内容。 下面是一个基本的HTML结构示例: <!DOCTYPE HTML> <html> <head> <meta char…

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