48 div 下面包含 el-radio, 点击 div 事件被触发多次

news2024/11/17 11:50:12

前言

这是一个最近碰到的一个很奇怪的问题 

情况如下一个 div 下面有一个 el-radio, 然后 div 上面配置了 click 的回调为 handleClick

然后 但是点击 div 的时候, handleClick 触发了两次 

然后 这里 来模拟一下, 并解决一下 这个问题

这里的知识主要是 设计到 label 和 表单元素 的联动

 

 

测试用例

包了多组 div 下面的多组 el-radio, 然后 这时候点击 选项1, 选项2, 选项3 会发现 handleClick 触发了两次 

<template>
  <div class="testParent" >
    <div class="radioParent" v-for="item in selectList" @click="handleClick($event, item)" style="float: left; ">
      <el-radio v-model="checkItem" :label="item.name"> {{item.name}} </el-radio>
    </div>
  </div>
</template>

<script>
  export default {
    name: 'App',
    components: {
    },
    data() {
      return {
        checkItem: '',
        selectList: [
          {code: 'opt1', name: '选项1' },
          {code: 'opt2', name: '选项2' },
          {code: 'opt3', name: '选项3' }
        ]
      };
    },
    computed: {},
    created() {
    },
    methods: {
      handleClick($event, item) {
        console.log(' clicked item ', $event, item);
      }
    }
  };
</script>

<style>
  .radioParent {
    cursor: pointer;
    width: 80px;
    height: 32px;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color: #ffffff;
    border-radius: 2px;
    border: solid 1px #d9dadb;
    color: #8c9094;
    font-size: 16px;
    margin-right: 13px;
  }

  .radioParent .el-radio {
    height: 32px !important;
    line-height: 32px !important;
  }
  .radioParent .el-radio__input {
    height: 32px !important;
    line-height: 32px !important;
  }
</style>

 

 

点击一下 选项2 结果如下 

可以看到 handleClick 的回调触发了两次

0dffb26ee64f4886930db39495a8f9e7.png

 

 

el-radio 中为什么点击 span 也能选中目标?

这是 我很疑惑的一个点, 然后 点开了 element-ui 的源码 编译了一下

然后 测试用例 复制进去, 跑起来 调试一下

然后 这里的 input 的 change 触发了, 但是 不知道 是哪里触发的

我这里点击的是 span[其内容是”选项2”], 但是事件传递到了 input 这里 

数据视图切换的标准是 input 框的 change 触发, 造成了 model 的更新, 才会进行切换 

9d6a2c68d13143ad8346a6e4470fba4a.png

 

然后开始 其他的调试

radioParent 的 div 的 事件处理列表 如下, 然后 其子元素也继承了这一套 事件处理列表

b78c7ce01d6d47798db4cbd351c2856e.png

 

然后 我们把 radioParent 的 div 的 事件处理列表 删除掉 

然后点击查看 radioParent 以及下面的各个子元素的 事件处理列表, 可以看到 除了 input框 还有 focus, blur, change 的 事件处理列表

e798707948274690a15262079e8d10d3.png

 

input 上面的事件如下 

a00dce0c81544bf0b9efea1f7c89e191.png

 

然后 此时再从 “其他选项” 点击到 “选项3” 的时候, 可以看到 这个 click 还是可以正常响应 

然后 这里可以判断出的就是 这个 input 的 change 事件 不是 span 传递过来的 

5ac5cc618ec34b6694f1517d0a6d4a95.png

 

 

label + input 标签的联动 – 修改 label

然后 最终搜索了一下 发现是 label + input 标签的联动 

当点击了 label 标签范围内的数据, 会自动视为点击了 input 标签, 提升了用户体验 

为了验证这个问题, 我们将 “选项3” 的 label 标签换成 span, 初始化状态 选中 “选项2”

 

点击 span “选项3” 可以看到的现象是 hanleClick 触发了一次, 但是 视图模型并没有切换过去, 说明 input框 没有选中, 但是在有 label 标签的时候点击了 label 进而使 input框选中了

0fcf2ee9efbe44488b7480bd64b6ec30.png

 

这里实际点击的元素是 el-radio__label 的 span

33d53cae305f44f29f8557d89209531c.png

 

点击 input 框, 可以看到的现象是 hanleClick 触发了一次, 但是 视图模型并没有切换过去 

说明 input框 没有选中, 但是在有 label 标签的时候点击了 label 进而使 input框选中了

840ea3ea698a4dad9777aab2f2a0cdc4.png

 

这里实际点击的元素是 el-radio__inner 的 span

d775e9d4ebf04825a2930affbd83e7e0.png

 

上面的点击 span 的时候 input 框没有被选中的道理很好理解, 但是 后者呢? 为什么选中了 input 框, 这时候点击 还是没有触发 input 框的更新 

这是因为 element-ui 配置的 z-index

input 框的 .el-radio__original 设置的 z-index 是 -1, el-radio__inner 的 span 的 z-index 是 auto, 在外层父元素的 z-index 也是 auto, 所以 点击到 按钮位置 实际上点击到的是 span 

这个也可以通过 上面的鼠标事件的 target 来进行判断 

84f7454006d043ed82ca7090a5ee6b62.png

 

“选项3” 的 input 设置一个 z-index 1000, 然后 点击看一下, 这之后 点击 input 元素 就能够正常选中了

55248c789c9245edb55ebba3d652c9c4.png

 

看一下 事件点击的元素 就是目标 input 框了 

348d546b07c742e8bafd70067941ba77.png

 

 

label + input 标签的联动 – 修改 input

修改 el-radio 的代码, 将 input 修改为 span, 然后 我们来查看一下 效果

62e645f205af42148ca23ea8a03f4018.png

点击一个选择框, 可以看到 handleClick 只会触发一次了 

同时 也因为缺少了 input 框, 导致没有触发 input 的 change, 导致 checkItem 未产生变化 

c817e36f87a4469696adaa4cae4d03fc.png

 

 

问题的调试

上面的这一个章节 只是一个基础的补充

然后 我们这里来看一下 我们这里用例的问题, 为什么 点击了一次 触发了 两次 click 函数 

第一个事件触发是点击的元素, 比如我们这里点击 label, 那就是 el-radio__label 的 span 元素, 如果我们这里点击的是 input 的位置, 那就是 el-radio__inner 的 span 

这里我们点击目标元素, 目标元素

4b152c46f8f440a982d390e979bbd61f.png

 

然后第二次事件触发的是 input 元素, 可以发现 不管点击的是 div 的哪一个区域, 第二次的 target 都是 input 元素 

这个 通过上面一个章节 的基础的补充, 应该还是 能够比较快的猜到是 label 的点击 然后使得事件传递到了 input 框 

6d4e26ccfbba4b8aae2d1692f6c39e64.png

 

 

问题的解决

  1. 这时候, 在这个场景下面 通常来说的处理方式 就是, 拿到 事件event, 然后根据 target 进行一个过滤, 比如 只处理 input 的这一个事件, 来保证业务的准确 
  2. 注册事件的时候注册为 click.prevent, 这样会阻止事件的默认行为, 比如这里的点击了 label 使得 input 收到同样的事件, 所以只会有第一个点击目标元素的事件 
  3. 不使用 el-radio, 这个实现是固定的, 无法改变, 使用其他的替代方案 

 

 

 

 

 

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

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

相关文章

机器人深度学习IMU和图像数据实现焊接精细操作

在双电极气体保护金属弧焊 &#xff08;DE-GMAW&#xff09; 中&#xff0c;对焊枪和旁路电极位置的精确控制是至关重要的。为了这一过程&#xff0c;科研团队提出了安装微型惯性测量单元&#xff08;IMU&#xff09;传感器和摄像头&#xff0c;来记录焊工控制焊枪的移动和微调…

来了!小学生Python创意编程(视频教学版)

目录 写在前面 推荐图书 推荐理由 写在最后 写在前面 在最好的年纪&#xff0c;一起来学Python吧&#xff01;本期博主给大家推荐一本适合小学生阅读的书籍&#xff0c;一起来看看吧~ 推荐图书 小学生Python创意编程&#xff08;视频教学版&#xff09; 直达链接&#x…

SOLIDWORKS 2024新功能之钣金和结构系统

达索系统SOLIDWORKS钣金和结构系统是大家比较熟悉的模块了&#xff0c;在SOLIDWORKS 2024版本中钣金和结构系统功能也做了很大的提升。接下来微辰三维带大家一起看看如何使用达索系统SOLIDWORKS 2024钣金和结构系统的一些新功能快速完成相应的设计。 达索系统SOLIDWORKS 2024的…

bugku-web-GET

这里很明显是让用get请求传递一个名为what的参数&#xff0c;这个参数如果为flag&#xff0c;就会输出flag

HBase的Python API(happybase)操作

一、Windows下安装Python库&#xff1a;happybase pip install happybase -i https://pypi.tuna.tsinghua.edu.cn/simple 二、 开启HBase的Thrift服务 想要使用Python API连接HBase&#xff0c;需要开启HBase的Thrift服务。所以&#xff0c;在Linux服务器上&#xff0c;执行如…

(4)(4.3) Kogger Sonar

文章目录 前言 1 推荐硬件 2 配置回声探测仪模块 3 连接ArduPilot硬件 4 参数说明 前言 KOGGER 声纳(KOGGER Sonar)是一款结构紧凑、成本低廉的水下回声测深仪模块&#xff0c;带有 UART 接口&#xff0c;电源电压为 5-14v。 1 推荐硬件 CP210x USB->UART 转换器和安装…

其实StartAI也是一款修图工具 用StartAI修图之“去除背景”

其实StartAI不仅仅是一款AI绘画插件&#xff0c;更是一款可以对我们的摄影图片、广告海报进行修图的AI修图工具。StartAI包含了AI绘画、AI修图等多种复合型AI智能实用工具。 用【背景移除】功能对图片一个背景修图 1.实体广告图片 我们可以通过【背景移除】将广告图中的实体…

在 Windows 11 上安装 MongoDB

MongoDB 是一个流行的 NoSQL 数据库&#xff0c;它提供了灵活的数据存储方案&#xff0c;而 MongoDB Compass 则是一个可视化管理工具&#xff0c;可以更轻松地与 MongoDB 数据库交互和管理。在本文中&#xff0c;我们将介绍如何在 Windows 11 上安装 MongoDB&#xff0c;并配置…

好看又好用,这 10 个宝藏 App 免费拿走不谢!

目录 1. 综合AI工具箱——HuluAI 2. 文本视频生成工具——Jujilu 3.翻译软件 —— TTime 4.专业录屏和直播软件 —— OBS Studio 5.开源跨平台轻量计时软件 —— wnr 6.开源跨平台绘图 —— Drawio 7.开源三维建模动画渲染 —— Blender 8.跨平台的多功能软件 —— Pear…

C 语言贪吃蛇源码解析

贪吃蛇是一款经典的电子游戏&#xff0c;玩家控制一条不断成长的蛇&#xff0c;需要避免撞到自己的身体或者游戏边界&#xff0c;同时吃掉出现在屏幕上的食物以增长身体长度。 下面是一个简单的贪吃蛇游戏的C语言实现&#xff0c;使用了标准输入输出库conio.h和时间库windows.h…

【C++】1323. 扩建花圃问题

问题&#xff1a;1323. 扩建花圃问题 类型&#xff1a;整数运算 题目描述&#xff1a; 梅山小学有一块长方形花圃&#xff08;花圃的长宽都是整数&#xff09;&#xff0c;长 m 米&#xff0c;宽未知。 在修建校园时&#xff0c;花圃的长增加了 n 米&#xff0c;此时发现增加…

Mybatis-获取参数值的两种方式

1. ${ } 和 #{ } MyBatis获取参数值的两种方式&#xff1a;${ } 和 #{ } 对于初学者来说&#xff0c;理解MyBatis中获取参数值的两种方式——#{}和${}&#xff0c;关键在于明白它们如何影响SQL语句的构建以及为何在安全性、灵活性上有显著差异。下面我将用简单易懂的语言来解…

SpringBoot+Prometheus+Grafana实现应用监控和报警

一、背景 SpringBoot的应用监控方案比较多&#xff0c;SpringBootPrometheusGrafana是目前比较常用的方案之一。它们三者之间的关系大概如下图&#xff1a; 关系图 二、开发SpringBoot应用 首先&#xff0c;创建一个SpringBoot项目&#xff0c;pom文件如下&#xff1a; <…

java数据结构与算法刷题-----LeetCode540. 有序数组中的单一元素

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 异或运算2. 全数组二分查找异或奇偶3. 偶数下标二分查找 1. 异…

Python学习之-正则表达式

目录 前言&#xff1a;1.re.serach1.1例子&#xff1a; 2.re.match2.1示例1&#xff1a;2.2 示例2&#xff1a; 3.re.findall3.1 示例 4.re.fullmatch4.1 示例1&#xff1a;4.2 示例2: 5.re.split5.1 示例1:5.2 示例2&#xff1a;5.3 示例3&#xff1a; 6.re.sub6.1 示例&#…

puzzle(1122)连线迷宫

目录 一&#xff0c;连线迷宫-经典模式 1&#xff0c;规则 2&#xff0c;策略 3&#xff0c;调整的局部性 4&#xff0c;八连通端点的线条合并 taptap小游戏 迷宫解谜 连线迷宫模式 一&#xff0c;连线迷宫-经典模式 1&#xff0c;规则 2&#xff0c;策略 分2步&#x…

脚本应使用项目的主要语言编写

原文&#xff1a;Joo Freitas - 2024.03.24 这是我长时间以来的一个深感赞同的观点。 我参与过的几乎所有项目&#xff0c;都有我们编写的用于自动化重复性过程的脚本。然而&#xff0c;大多数脚本在几周后变得过时且难以维护&#xff0c;因为我们要么不再需要它们&#xff0…

Golang hash/crc32 库实战指南:从基础到优化

Golang hash/crc32 库实战指南&#xff1a;从基础到优化 引言理解CRC32hash/crc32库概览实战技巧数据校验性能优化多线程应用 错误处理与调试错误处理调试 实际案例分析结论 总结重点回顾 引言 在现代软件开发中&#xff0c;数据的完整性和安全性至关重要。无论是数据库存储、…

计算机组成原理 — 指令系统

指令系统 指令系统指令的概述指令的格式指令的字长取决于 操作数类型和操作种类操作数的类型数据在存储器中的存放方式操作类型 寻址方式指令寻址数据寻址立即寻址直接寻址隐含寻址间接寻址寄存器寻址寄存器间接寻址基址寻址变址寻址堆栈寻址 RISC 和 CISC 技术RISC 即精简指令…

K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 在上一章节中&#xff0c;我们详细探讨了Pod的概念、创建、…