JS事件冒泡与JS事件代理(事件委托)

news2024/12/24 21:34:53

JS事件冒泡与JS事件代理(事件委托)

  • 1、事件冒泡
    • 1.1 概念
    • 1.2 要是不给子元素添加具体的oncilck处理方法,也能冒泡么?
    • 1.3 子元素触发的事件冒泡会触发父元素所有的事件么?还是触发对应的事件?
    • 1.4 那么我们应该如何组织这讨厌的事件冒泡机制呢?
  • 2、事件委托(事件代理)
    • 2.1 概念
    • 2.2 for循环遍历给每个li添加事件
    • 2.3 利用事件代理给li添加事件

1、事件冒泡

1.1 概念

通俗来讲,当触发(点击或者触摸之类的做法)有父元素的子元素的时候,事件会从事件源(被点击的子元素)开始逐级向上传播,触发父级元素的点击事件,一直会传到window。如果在某一层想要中止冒泡,使用 event.stopPropagation() 。下面见详细的代码:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    #parent {
      width: 400px;
      height: 400px;
      background-color: blue;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    #child {
      width: 200px;
      height: 200px;
      background-color: brown;
    }
  </style>

</head>

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

  <script>

    let parent = document.getElementById('parent')
    parent.onclick = function () {
      console.log('parent')
    }

    let child = document.getElementById('child')
    child.onclick = function () {
      console.log('child')
    }

  </script>
</body>

</html>

在这里插入图片描述
我们可以发现,当点击红色区域(子元素)的时候,父级元素的click事件也被触发了。

接下来看两个示例:

1.2 要是不给子元素添加具体的oncilck处理方法,也能冒泡么?

<script>

    // let parent = document.getElementById('parent')
    // parent.onclick = function () {
      // console.log('parent')
    // }

    let child = document.getElementById('child')
    child.onclick = function () {
      console.log('child')
    }

  </script>

效果如下:
在这里插入图片描述
子元素在没有定义具体的click处理函数的时候仍然可以冒泡,触发父级元素的click事件。

1.3 子元素触发的事件冒泡会触发父元素所有的事件么?还是触发对应的事件?

 <script>

    let parent = document.getElementById('parent')
    parent.onkeydown = function () {
      console.log('parent')
    }

    let child = document.getElementById('child')
    child.onclick = function () {
      console.log('child')
    }

  </script>

结果如下:
在这里插入图片描述
我们发现只有相应的事件会发生事件冒泡,不相关的事件不受影响(注意由于click为鼠标的点击,所以同样会触发mousedown与mouseup等相关事件,同时发生冒泡!)

1.4 那么我们应该如何组织这讨厌的事件冒泡机制呢?

很简单,在事件触发时,会传入一个相应的event对象,其中有一个stopPropagation()方法可以阻止事件冒泡(IE中为cancleBubble=true),以下是详细代码:

 <script>
    let parent = document.getElementById('parent')
    parent.onclick = function () {
      console.log('parent')
    }

    let child = document.getElementById('child')
    child.onclick = function (ev) {
      var e = ev || window.event
      // console.log(e)
      console.log('child')
      stopPropagation(e)
    }
    function stopPropagation (e) {
      if (e.stopPropagation) {
        e.stopPropagation()
      } else {
        e.cancelBubble = true
      }
    }
  </script>

结果如下:
在这里插入图片描述
可以通过运行结果来看,事件冒泡成功被阻止了。

看到这里,相信小伙伴们可能会觉得事件冒泡很麻烦,还需要写个事件阻止冒泡行为。但凡事都有双刃剑,事件冒泡同时给我们带来的还有事件委托这一减少DOM操作的神器。

2、事件委托(事件代理)

2.1 概念

事件委托,首先按字面的意思就能看你出来,是将事件交由别人来执行,再联想到上面讲的事件冒泡,是不是想到了?对,就是将子元素的事件通过冒泡的形式交由父元素来执行。下面经过详细的例子来说明事件委托:

2.2 for循环遍历给每个li添加事件

在开发的时候可能会遇到这种情况:如给ul下的每个li都加一个事件,你可能会通过遍历来给每个栏目添加事件:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

</head>

<body>
  <ul id="parentUl">
    <li>我是子元素</li>
    <li>我是子元素</li>
    <li>我是子元素</li>
  </ul>

  <script>

    var ul = document.getElementById('parentUl'),
      li = ul.getElementsByTagName('li')
    for (var i = 0; i < li.length; i++) {
      li[i].onclick = function () {
        alert(this.innerHTML)
      }
    }
  </script>
</body>

</html>

在这里插入图片描述
这种方式来添加事件固然简单,但是需要多次操作DOM,如果有100、1000个同级的元素需要添加事件,这种方式就不可取了。

2.3 利用事件代理给li添加事件

事件委托是利用事件的冒泡原理来实现的,比如我们平时在给ul中的li添加事件的时候,我们都是通过for循环一个个添加,如果li很多个的话,其实就有点占内存了,这个时候可以用 事件代理来优化性能,

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <ul id='ulid' onclick='clickFunc()'>
    <li>1个li</li>
    <li>2个li</li>
    <li>3个li</li>
    <li>4个li</li>
    <li>5个li</li>
  </ul>

  <script>
    function clickFunc (ev) {
      var ev = ev || window.event
      console.log(ev)
      var oLi = ev.srcElement || ev.target
      if (oLi.nodeName.toLowerCase() == 'li') {
        alert(oLi.innerText)
      }

    }

  </script>
</body>

</html>

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/652578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch笔记:Conv2d 和 ConvMixer

来自B站视频&#xff0c;API查阅&#xff0c;TORCH.NN nn.Conv2d 中一般 kernel_size 是小奇数&#xff08;很多是3&#xff09;&#xff0c;padding 设置为 k − 1 2 \frac{k-1}{2} 2k−1​&#xff08;实际上padding的是 k − 1 k-1 k−1&#xff0c;因为参数的意义是左右各…

苹果新专利曝光:AirTags可以快速找到Apple Pencil

近日&#xff0c;据外媒报道&#xff0c;苹果一项新专利提出&#xff0c;苹果手写笔可以通过“声学谐振器”来帮助用户找出手写笔的位置。根据这项专利&#xff0c;苹果试图在手写笔的笔盖上加入一个被动元件&#xff0c;以响应特定的声波频率。iPhone、iPad或Apple Watch会发出…

【OpenMMLab AI实战营二期笔记】第七天 MMDetection代码课

0. 环境检测和安装 # 安装 mmengine 和 mmcv 依赖 # 为了防止后续版本变更导致的代码无法运行&#xff0c;暂时锁死版本 pip install -U "openmim0.3.7" mim install "mmengine0.7.1" mim install "mmcv2.0.0"# Install mmdetection rm -rf mmd…

【SpringBoot】SpringBoot集成支付宝支付

文章目录 背景1、预期效果展示2. 开发流程2.1 沙盒调试2.1.1. 创建沙盒应用2.1.2. SpringBoot代码实现2.1.3. 前端代码实现 2.2 创建并上线APP 背景 在开始集成支付宝支付之前&#xff0c;我们需要准备一个支付宝商家账户&#xff0c;如果是个人开发者&#xff0c;可以通过注册…

硬件速攻-E18-D80NK红外光电传感器

介绍 E18-D80NK光电开关是一款常见的光电传感器&#xff0c;具有高性价比、安装方便等优点。其工作原理是利用发射管发射出的红外线照射目标物&#xff0c;当目标物接近开关时&#xff0c;被照射的红外线反射回接收器&#xff0c;接收器就会向微处理器发出信号&#xff0c;从而…

1.9C++不同数据类型转换

C不同数据类型转换 在 C中&#xff0c;不同类型之间的数据转换可以通过强制类型转换&#xff08;类型转换运算符&#xff09;来实现。 C 中强制类型转换有以下三种&#xff1a; 1、static_cast static_cast 可以用于基本数据类型之间的转换&#xff0c;也可以用于类层次结构…

从实现到原理,总结11种延迟任务的实现方式(下)

7 监听Redis过期key 在Redis中&#xff0c;有个发布订阅的机制 生产者在消息发送时需要到指定发送到哪个channel上&#xff0c;消费者订阅这个channel就能获取到消息。图中channel理解成MQ中的topic。 并且在Redis中&#xff0c;有很多默认的channel&#xff0c;只不过向这些…

小鱼深度产品测评之:阿里云云效代码管理 Codeup,一款数十万企业正在使用,全方位保护企业代码资产的实力产品,。

云效代码管理 Codeup 0、引言1、进入页面2、创建代码库3、资源文件页面4、分支→新建保护分支规则5、分支-基本设置5.1 基本信息 模块5.2 存储空间管理 6、分支→仓库备份6.1 点击 如何启用 按钮6.2 点击 前往企业设置查看 7、合并请求8、度量报表9、动态10、流水线11、总结 0、…

基于html+css的图展示129

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

24届秋招专场 · 数组如何用双指针解题呢?

你好&#xff0c;我是安然无虞。 文章目录 删除有序数组中的重复项删除排序链表中的重复元素移除元素移除零 大家好&#xff0c;近期主要更新数组相关的解题算法咯&#xff0c;感兴趣的老铁可以一起看过来啦。 今天更新使用双指针解决数组部分题型&#xff0c;注意哦&#xff…

支付宝小程序云亮相!向小程序生态开放全面云服务

前言&#xff1a; 小程序是一种轻量级应用程序&#xff0c;不需要安装即可直接在手机上使用。相较于传统的APP来讲&#xff0c;其无需下载安装&#xff0c;轻便快捷&#xff0c;快速启动&#xff0c;易于推广的良好特性为我们所青睐。 为此&#xff0c;支付宝小程序云&#xff…

DataX在有赞大数据平台的实践

文章目录 一、需求二、选型三、前期设计3.1 运行形态3.2 执行器设计3.3 开发策略 四、Datax-Web五、总结 大家好&#xff0c;我是脚丫先生 (o^^o) 在看技术文章的时候&#xff0c;发现有赞平台采用过Datax。想到指北数据中台&#xff0c;数据汇聚采用的是Datax-web二次开发&am…

chatgpt赋能python:Python的字符串索引操作技巧

Python的字符串索引操作技巧 Python是一个强大而灵活的编程语言&#xff0c;被广泛用于各种领域。在Python中&#xff0c;字符串是一个非常重要的数据类型&#xff0c;它可以包含文本、数字、符号和其他任何字符。在处理字符串时&#xff0c;索引操作是常见的操作之一。本文将…

计算机网络之网络层:数据平面

四.网络层&#xff1a;数据平面 4.1 网络层概述 网络层被分解为两个相互作用的部分&#xff0c;即数据平面和控制平面。 数据平面决定到达路由器输入链路之一的数据报如何转发到该路由器的输出链路之一&#xff0c;转发方式有&#xff1a; 传统的IP转发&#xff1a;转发基于…

【算法与数据结构】707、LeetCode设计链表

文章目录 一、题目二、设计链表三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、设计链表 思路分析&#xff1a;这里我将的成员函数放在类外实现了&#xff0c;这样链表类看起来更加简洁&#xff0c;方便大家…

jenkins用户权限管理

环境准备: 登录jenkins: http://192.168.9.190:8091/ admin asdwhl@0 一、用户权限插件安装 1、Dashboard > Manage Jenkins > Manage Plugins > Available(可选插件) 依次安装: Role-based Authorization Strategy Authorize Project

校园二手交易平台实训报告

目 录 一、设计背景 1. 需求分析 2. 课题研究的目的和意义 二、系统需求分析与开发环境 1. 系统功能需求 2. 系统界面需求 3. 开发环境 三、系统设计 四、系统测试 1. 脑模拟器测试 五、总结与展望 六、重要程序 1. LoginActivity 2. RegisterActiv…

51Proteus仿真数控0~20mA恒流源串口DAC0832数码管显示-0036

51Proteus仿真数控0~20mA恒流源串口DAC0832数码管显示-0036 Proteus仿真小实验&#xff1a; 51Proteus仿真数控0~20mA恒流源串口DAC0832数码管显示-0036 功能&#xff1a; 硬件组成&#xff1a;AT89C51单片机 6位数码管DAC0832电压输出多个按键&#xff08;设置、移动、加、…

INTERSPEECH 2023论文|基于多频带时频注意力的复调音乐旋律提取

论文题目&#xff1a; MTANet: Multi-band Time-frequency Attention Network for Singing Melody Extraction from Polyphonic Music 作者列表&#xff1a; 高虞安&#xff0c;胡英&#xff0c;王柳淞&#xff0c;黄浩&#xff0c;何亮 研究背景 复调音乐是一种具有多个声…

[PyTorch][chapter 41][卷积网络实战-LeNet5]

前言 这里结合前面学过的LeNet5 模型&#xff0c;总结一下卷积网络搭建&#xff0c;训练的整个流程 目录&#xff1a; 1&#xff1a; LeNet-5 2: 卷积网络总体流程 3&#xff1a; 代码 一 LeNet-5 LeNet-5是一个经典的深度卷积神经网络&#xff0c;由Yann LeCun在1998年提…