一起来学习一下JavaScript的事件流

yizhihongxing

关于JavaScript事件流,我为大家准备了一份完整攻略,一起来学习一下。

什么是JavaScript事件流

JavaScript事件流是指浏览器中发生事件(如鼠标点击、键盘输入等)时,事件在DOM树结构中按照特定顺序发送和处理的过程。这个过程包含三个阶段:捕获阶段、目标阶段和冒泡阶段。

捕获阶段

在事件到达目标元素之前,从根节点到目标元素之间的所有节点都会接受到该事件的通知。这个过程叫做捕获阶段。

示例:

<html>
  <body>
    <div id="outer">
      <div id="inner"></div>
    </div>
  </body>
</html>

<script>
    var outer = document.getElementById('outer');
    var inner = document.getElementById('inner');
    outer.addEventListener('click', function(){
      console.log('outer capture');
    }, true);
    inner.addEventListener('click', function(){
      console.log('inner capture');
    }, true);
    outer.addEventListener('click', function(){
      console.log('outer bubble');
    }, false);
    inner.addEventListener('click', function(){
      console.log('inner bubble');
    }, false);
</script>

页面中有两个div元素,分别为外层div和内层div,外层div包含了内层div。通过JS代码给两个div元素绑定了两个click事件,分别在捕获阶段和冒泡阶段输出对应的信息。当我们在内层div上点击鼠标时,事件就会沿着根节点 -> 外层div -> 内层div的顺序进行捕获,最后到达目标元素内层div。在这个过程中,'outer capture'和'inner capture'两个信息会被输出。注意,代码中addEventListener第三个参数用来控制事件是否在捕获阶段执行,默认值是false,即事件在冒泡阶段执行。

目标阶段

目标阶段,即事件已经到达目标元素本身。如果该元素绑定了相应的事件处理函数,那么就开始执行该函数。如果在该元素上绑定了多个相同事件的处理函数,那么先绑定的会先执行。

示例:

<html>
  <body>
    <button id="button">Click me!</button>
  </body>
</html>

<script>
    var button = document.getElementById('button');
    button.addEventListener('click', function(){
      console.log('first click');
    });
    button.addEventListener('click', function(){
      console.log('second click');
    });
</script>

页面中有一个按钮,JS代码中给该按钮绑定了两个click事件处理函数,分别输出'first click'和'second click'。当我们点击按钮时,在目标阶段会输出这两个信息。

冒泡阶段

在冒泡阶段,事件开始从目标元素返回到根节点。在这个过程中,根据DOM结构,从目标元素到根节点的每个节点都将接收该事件通知。注意,HTML标签本身是节点,所以根节点到目标元素期间每个HTML标签都会接收到事件通知。

示例:

<html>
  <body>
    <div id="outer">
      <div id="inner"></div>
    </div>
  </body>
</html>

<script>
    var outer = document.getElementById('outer');
    var inner = document.getElementById('inner');
    outer.addEventListener('click', function(){
      console.log('outer bubble');
    }, false);
    inner.addEventListener('click', function(){
      console.log('inner bubble');
    }, false);
    outer.addEventListener('click', function(){
      console.log('outer capture');
    }, true);
    inner.addEventListener('click', function(){
      console.log('inner capture');
    }, true);
</script>

和第一个示例中相同的代码,只是事件处理函数的调用阶段改为冒泡阶段。这时,在内层div上点击鼠标时,事件会沿着内层div -> 外层div -> 根节点的顺序进行冒泡,最后输出'outer bubble'和'inner bubble'。

小结

本文简单介绍了JavaScript的事件流及其分为的三个阶段:捕获阶段、目标阶段和冒泡阶段。并给出了两个示例来说明上述三个阶段的执行顺序。通过学习事件流,可以更好地理解事件的原理和实现,并编写出更加高效的事件处理代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一起来学习一下JavaScript的事件流 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript中常见获取元素的方法汇总

    我们来详细讲解一下“JavaScript中常见获取元素的方法汇总”。 一、通过ID获取元素 在JavaScript中获取元素的最基本的方式就是通过元素的ID来获取,通过这种方式可以获取HTML中的任何元素。使用document.getElementById()方法可以获取指定ID的元素。 示例代码: // 获取ID为“myButton”的button元素 v…

    JavaScript 2023年6月10日
    00
  • 你有必要知道的25个JavaScript面试题

    下面是详细讲解“你有必要知道的25个JavaScript面试题”的完整攻略。 介绍 在面试过程中,JavaScript是一个非常重要的方面,掌握常见的JavaScript面试题可以帮助我们更好地准备面试。这里整理了25个常见的JavaScript面试题供大家参考。 问题列表 1. typeof null 返回什么? typeof null 返回 “objec…

    JavaScript 2023年5月28日
    00
  • js实现抽奖的两种方法

    下面给出JS实现抽奖的两种方法的完整攻略。 方法一:用Math.random()生成随机数 1.创建一个数组,用来存储奖品种类和对应的中奖概率,例如: let awards = [ {name: ‘一等奖’, probability: 0.1}, {name: ‘二等奖’, probability: 0.2}, {name: ‘三等奖’, probabili…

    JavaScript 2023年6月11日
    00
  • Javascript 判断函数类型完美解决方案

    下面我将为你详细讲解“Javascript 判断函数类型完美解决方案”的完整攻略。 1. 判断函数类型的问题 在Javascript中,判断某个值的类型是一件很常见的事情。通常我们可以使用typeof操作符来对一个值的类型进行判断。但是当对于函数类型时,使用typeof只能得到返回值为function,无法区别不同类型的函数。 我们知道在Javascript…

    JavaScript 2023年5月27日
    00
  • javascript实现设置、获取和删除Cookie的方法

    下面是关于“JavaScript实现设置、获取和删除Cookie的方法”的完整攻略。 设置Cookie Cookie是HTTP协议提供的一种状态管理机制。可以通过JS设置Cookie来在浏览器端存储一些信息。在JavaScript中,设置Cookie主要包括三个步骤: 将需要存储的数据转换为字符串格式。 将存储字符串写入Cookie。 设置Cookie的过期…

    JavaScript 2023年6月11日
    00
  • JavaScript 中的作用域与闭包

    作用域 (Scope) 是 JavaScript 代码中的一个重要概念。它定义了变量和函数的可见度以及使用的方式。在 JavaScript 代码中,有着局部作用域和全局作用域。使用作用域可以让代码更加封闭和安全,同时也增加了代码的可读性。 一、作用域的概念 全局作用域: 全局作用域是指在 JavaScript 代码中所有的地方都能访问到的变量、函数和对象; …

    JavaScript 2023年5月28日
    00
  • JS定时器使用,定时定点,固定时刻,循环执行详解

    关于JS定时器的使用,通常有两种方式:setTimeout和setInterval。其中,setTimeout可以在指定的时间后执行一次代码,而setInterval则可以每隔指定的时间重复执行代码,直到手动停止它。 setTimeout 语法 setTimeout(function, milliseconds, param1, param2, …) 参…

    JavaScript 2023年5月27日
    00
  • js给对象动态添加、设置、删除属性名与属性值实例代码

    让我们来详细讲解“js给对象动态添加、设置、删除属性名与属性值实例代码”的完整攻略。 添加属性名与属性值 我们可以使用点号(.)或者方括号[]的方式来向对象动态添加属性名和属性值。 点号添加 点号添加属性名和属性值的方式简单易懂,只需要在对象名后面接一个点号,再加上新的属性名,然后设置属性值即可。如下面这个例子: let obj = { name: &quo…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部