JavaScript事件学习小结(一)事件流

JavaScript事件学习小结(一)事件流

前言

JavaScript 是一种基于事件驱动的编程语言,而事件机制也是 JavaScript 中非常重要的一部分。本篇笔记介绍的是事件流的相关知识,对于理解事件机制起着重要的作用。

什么是事件流?

当一个事件发生时,JavaScript 引擎会按照一定的顺序处理事件。这个顺序就是事件流。

事件流分为两种:冒泡流和捕获流。

冒泡流

冒泡流是指当一个事件触发时,首先执行最内层元素上的事件处理程序,然后逐步向外层元素冒泡,直到最外层元素。

例如,我们有以下 HTML 结构:

<div>
  <p>text</p>
</div>

当我们在 <p> 元素上绑定一个 click 事件,且点击了 <p> 元素,事件触发顺序如下:

  1. 最先执行 <p> 元素上的 click 事件处理程序。
  2. 然后向外层元素 <div> 冒泡,执行 <div> 元素上的 click 事件处理程序。

捕获流

捕获流是指当一个事件触发时,首先执行最外层元素上的事件处理程序,然后逐渐向里层元素捕获,直到最内层元素。

例如,我们有以下 HTML 结构:

<div>
  <p>text</p>
</div>

当我们在 <p> 元素上绑定一个 click 事件,且点击了 <p> 元素,事件触发顺序如下:

  1. 最先执行 <div> 元素上的 click 事件处理程序。
  2. 然后向内层元素 <p> 捕获,执行 <p> 元素上的 click 事件处理程序。

事件流总结

事件流有两种:冒泡流和捕获流。冒泡流是从内向外执行事件处理程序,而捕获流则相反,是从外向内执行事件处理程序。

示例说明

示例一

下面是一个简单的 HTML 页面:

<!DOCTYPE html>
<html>
  <head>
    <title>Event Flow Demo</title>
  </head>
  <body>
    <div id="outerDiv">
      <div id="innerDiv">
        <button id="myButton">Click me!</button>
      </div>
    </div>
    <script>
      document.getElementById("outerDiv").addEventListener(
        "click",
        function (event) {
          console.log("outerDiv clicked");
        },
        false
      );

      document.getElementById("innerDiv").addEventListener(
        "click",
        function (event) {
          console.log("innerDiv clicked");
        },
        false
      );

      document.getElementById("myButton").addEventListener(
        "click",
        function (event) {
          console.log("button clicked");
        },
        false
      );
    </script>
  </body>
</html>

在示例中,我们绑定了三个元素的 click 事件,分别是外部 div 元素、内部 div 元素和按钮元素。

当我们点击按钮时,事件触发的顺序如下:

  1. 首先执行按钮元素上的 click 事件处理程序,输出 button clicked
  2. 然后向外层元素 <div id="innerDiv"> 冒泡,执行 <div id="innerDiv"> 元素上的 click 事件处理程序,输出 innerDiv clicked
  3. 最后向外层元素 <div id="outerDiv"> 冒泡,执行 <div id="outerDiv"> 元素上的 click 事件处理程序,输出 outerDiv clicked

示例二

下面是一个在 ul 元素上进行事件委托的例子:

<!DOCTYPE html>
<html>
  <head>
    <title>Event Flow Demo</title>
  </head>
  <body>
    <ul id="myList">
      <li>一</li>
      <li>二</li>
      <li>三</li>
      <li>四</li>
      <li>五</li>
    </ul>
    <script>
      var myList = document.getElementById("myList");
      myList.addEventListener("click", function (event) {
        if (event.target.tagName === "LI") {
          console.log(event.target.innerHTML);
        }
      });
    </script>
  </body>
</html>

在示例中,我们绑定了 ul 元素上的 click 事件,而我们只关心对 li 元素的点击事件。因此,我们通过在 ul 上进行事件委托,只在 ul 元素上绑定一个事件处理程序,通过判断 event.target 来确定触发事件的元素是否为 li 元素。

当我们点击 li 元素时,事件触发的顺序如下:

  1. 执行 ul 元素上的 click 事件处理程序。
  2. 判断触发事件的元素是否为 li 元素。
  3. 如果是,则输出 li 元素的文本内容。

通过事件委托,我们可以精简代码,减少绑定事件处理程序的次数,提高代码效率。

结论

以上就是事件流的相关知识和示例说明。掌握事件流的原理和使用方法,有利于我们正确处理事件操作,避免出现因事件触发顺序而产生的问题。

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

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

相关文章

  • JS event使用方法详解

    关于JS Event使用方法的详解,可以从以下几个方面入手: 1. 什么是JS Event(事件)? 在JavaScript中,Event是一种交互方式,可以监听用户的行为,例如鼠标点击、键盘输入等;也可以监听浏览器或者文档的行为,例如窗口的加载、滚动等。当某种交互或者事件发生时,Event会对应地触发相应的回调函数。 2. JS中的Event常见属性和方法…

    JavaScript 2023年5月28日
    00
  • ES2020 新特性(种草)

    ES2020 新特性(种草) ES2020是ECMAScript标准的最新版本。此版本包含了许多新特性,使得JavaScript开发更加方便和高效。本篇攻略将介绍ES2020中的新特性。 1. 可选链操作符(?.) 通常情况下,在使用对象属性或方法之前,需要先检查该对象是否存在。比如: if (obj && obj.prop) { // do…

    JavaScript 2023年5月28日
    00
  • Python3实现飞机大战游戏

    Python3实现飞机大战游戏攻略 1. 准备工作 在开始编写游戏代码之前,需要安装好Pygame库。 在Windows系统下可以使用pip命令进行安装: pip install pygame 在Linux系统下可以使用以下命令安装: sudo apt-get install python3-pygame 2. 创建窗口 使用Pygame库创建游戏窗口的代码…

    JavaScript 2023年6月11日
    00
  • javascript转换字符串为dom对象(字符串动态创建dom)

    当我们需要通过JS动态创建页面元素时,我们可以将HTML代码存储在字符串中,然后使用JavaScript中的一些操作将其转换为DOM对象。本文将详细介绍这个过程。 1. 使用innerHTML属性创建DOM对象 我们可以使用innerHTML属性将字符串转换为DOM对象。首先,我们需要选择一个已经存在的DOM元素,然后设置它的innerHTML属性为我们要动…

    JavaScript 2023年5月28日
    00
  • javascript 兼容各个浏览器的事件

    JS 兼容各个浏览器的事件主要是针对旧版浏览器(如IE 8及以下版本)的事件处理进行兼容。 一、事件绑定兼容处理 旧版浏览器中经常使用 attachEvent 方法绑定事件,而现代浏览器则使用 addEventListener 方法。因此需要对这两种方法进行不同的处理以实现跨浏览器兼容。 function addEventHandler(element, e…

    JavaScript 2023年6月10日
    00
  • .Net 单例模式(Singleton)

    单例模式(Singleton)概述 单例模式是设计模式中一种常见的创建型模式,其定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。使用单例模式可以确保一个类只被创建一次,并且该类的唯一实例可以被进行全局访问和控制。 在 .Net 中,单例模式可以应用于许多场景,例如控制数据库连接、记录系统日志、全局配置信息等等。下面将介绍如何在 .Net 应用程…

    JavaScript 2023年5月28日
    00
  • 一个js拖拽的效果类和dom-drag.js浅析

    一个JS拖拽效果类和dom-drag.js浅析 简介 在Web开发中经常会用到拖拽效果,通过鼠标拖拽元素然后移动到指定位置的操作。这里将介绍JS实现拖拽效果的步骤和原理,并且分析一下dom-drag.js这个开源库的具体实现方式。 拖拽效果的实现步骤 1. 获取拖拽元素 首先需要获取要拖拽的元素,可以通过document.getElementById等方法获…

    JavaScript 2023年6月10日
    00
  • 页面定时刷新(1秒刷新一次)

    要实现页面定时刷新,我们可以使用JavaScript里的定时器(setInterval)函数来定时刷新页面。该函数能够按照一定的时间间隔定期调用指定的函数或代码。以下是实现页面定时刷新的完整攻略: 第一步:编写一个刷新页面的函数 我们需要编写一个JavaScript函数来刷新页面。该函数将会在定时器周期性调用。这个函数可以通过 location.reload…

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