46 div 下面包含 el-radio, 导致点击一次 div, div 的 click 事件执行多次

前言

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

情况如下一个 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 的回调触发了两次

d8d619c35e394dffaaea184ade669b45.png

 

 

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

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

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

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

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

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

b537e0cbb6994318a769c0bf5bd71698.png

 

然后开始 其他的调试

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

ade1567b3dcc49f9ad55f62c910b3849.png

 

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

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

f32c019d4c304c1b83a87619659ec713.png

 

input 上面的事件如下 

b6dca95b3482440988cad05977a37f3a.png

 

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

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

39b233b683334c7cbad0d920bc2c4e2b.png

 

 

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

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

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

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

 

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

cb9f06413b164d108d1884b0379b6dae.png

 

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

0a3f11e01f4844d28ffedd0fee9480ee.png

 

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

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

e3bb7e32603e43aa9cc1f125c3a7367c.png

 

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

34c5fdfd4ae44c4ebb6df2edac0c3bc4.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 来进行判断 

e77f07732366448db0ff7c4744a6df4a.png

 

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

1d7bf89d22fb4dec92ebc2643ca17c96.png

 

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

13af28ce7fe948de9b50f5571b696b38.png

 

 

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

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

378b005e617342dd8bc4ad9d112f8f38.png

 

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

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

dd23093fb9054167bdea6c522fc6c629.png

 

 

问题的调试

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

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

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

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

075051051153444bbcbd2ff4e7a48b59.png

 

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

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

90b2eec93c724a37a32b17c7ccda8a08.png

 

 

问题的解决

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

 

 

完 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch反向传播算法

目录 1. 链式法则复习2. 多输出感知机3. 多层感知机4. 多层感知机梯度推导5. 反向传播的总结 1. 链式法则复习 2. 多输出感知机 3. 多层感知机 如图&#xff1a; 4. 多层感知机梯度推导 简化式子把( O k O_k Ok​ - t k t_k tk​) O k O_k Ok​(1 - O k O_k Ok​)起个别名…

09-LearnTheArchitecture-MemoryManagement

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 1 Overview 本文介绍了 Armv8-A 中的内存转换&#xff0c;这是内存管理的关键。 它解释了虚拟地址如何转换为物理地址、转换表格式以及软件如何管理Translation Lookaside Buffe…

阿里云对象存储OSS入门

阅读目录 一、阿里云OSS的使用 1、OSS是什么&#xff1f;2、OSS的使用 二、阿里云OSS的使用三、图床的搭建四&#xff1a;图床绑定阿里云OSS 编写不易&#xff0c;如果我的文章对你有帮助的话&#xff0c;麻烦小伙伴还帮忙点个赞再走&#xff01; 如果有小伙伴觉得写的啰嗦&a…

【倪琴仲尼式-雷伴】全新倪诗韵精品杉木古琴

试音中的用弦&#xff1a;梦音&#xff0c;视频录音无任何处理&#xff0c;所见即所得。 现琴比照片更好看。倪琴吊牌、琴额后面的编码和倪琴官网上的序列号是一一对应的&#xff0c;可查。 雷伴&#xff0c;“伴”字取意陪伴、相伴、依随。栗壳色&#xff0c;纯鹿角霜生漆工艺…

C#打印50*30条码标签

示例图&#xff1a; 源码下载地址&#xff1a;https://download.csdn.net/download/tiegenZ/89035407?spm1001.2014.3001.5503

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(持续更新)

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛B题 解题全流程&#xff08;持续更新&#xff09; -----基于多模态特征融合的图像文本检索 一、写在前面&#xff1a; ​ 本题的全部资料打包为“全家桶”&#xff0c; “全家桶”包含&#xff1a;模型数据、全套代码、训练好的模…

解决npm init vue@latest证书过期问题:npm ERR! code CERT_HAS_EXPIRED

目录 一. 问题背景 二. 错误信息 三. 解决方案 3.1 临时解决办法 3.2 安全性考量 一. 问题背景 我在试图创建一个新的Vue.js项目时遇到了一个问题&#xff1a;npm init vuelatest命令出现了证书过期的错误。不过这是一个常见的问题&#xff0c;解决起来也简单。 二. 错误…

LabVIEW无人机大气数据智能测试系统

LabVIEW无人机大气数据智能测试系统 随着无人机技术的迅速发展&#xff0c;大气数据计算机作为重要的机载设备&#xff0c;在确保飞行安全性方面发挥着重要作用。设计了一套基于LabVIEW的无人机大气数据智能测试系统&#xff0c;通过高效、稳定的性能测试&#xff0c;及时发现…

Java八股文(SpringCloud Alibaba)

Java八股文のSpringCloud Alibaba SpringCloud Alibaba SpringCloud Alibaba Spring Cloud Alibaba与Spring Cloud有什么区别&#xff1f; Spring Cloud Alibaba是Spring Cloud的衍生版本&#xff0c;它是由Alibaba开发和维护的&#xff0c;相比于Spring Cloud&#xff0c;它在…

华为汽车图谱

极狐 极狐&#xff08;ARCFOX&#xff09;是由北汽、华为、戴姆勒、麦格纳等联合打造。总部位于北京蓝谷。 问界 华为与赛力斯&#xff08;东风小康&#xff09;合作的成果。 阿维塔 阿维塔&#xff08;AVATR&#xff09;是由长安汽车、华为、宁德时代三方联合打造。公司总部位…

二十八 超级数据查看器 讲解稿 收藏功能

二十八 超级数据查看器 讲解稿 收藏功能 ​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 大家好&#xff0c;这节课我们讲一下超级数据查看器的收藏功能&#xff0c;收藏功能是2.0版本将要增加的功能 这节课算是预告。 收藏功能是…

C#进阶-反射的详解与应用

一、反射的概念 反射是.NET框架提供的一个功能强大的机制&#xff0c;它允许程序在运行时检查和操作对象的类型信息。通过使用反射&#xff0c;程序可以动态地创建对象、调用方法、访问字段和属性&#xff0c;无需在编译时显式知道类型信息。在.NET中&#xff0c;所有类型的信…

Java项目:77 springboot母婴商城

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本课题后端使用SpringBoot Spring Cloud框架&#xff0c;前端采用html&#xff0c;JQuery&#xff0c;JS&#xff0c;DIVCSS技术进行编程&…

对谈Concured首席技术官:利用AI和MongoDB打造个性化内容推荐系统

Built with MongoDB 栏目采访了AI初创企业Concured在成立约一年后加入的首席技术官 Tom Wilson&#xff0c;围绕 Concured 的人工智能使用情况、Wilson 加入团队的过程、坚持选择MongoDB的原因以及公司未来发展展开讨论。 关于Concured 内容无处不在。无论消费者寻找什么或所处…

阐述el-dropdown(下拉菜单)的基本知识

目录 1. 基本知识2. Demo3. 实战 1. 基本知识 el-dropdown是一个常用的UI组件&#xff0c;用于创建下拉菜单&#xff0c;通常用于实现各种交互式菜单、导航栏或下拉选项 确保安装Element UI库&#xff0c;它包含了el-dropdown组件 npm install element-ui # 或者 yarn add e…

海格里斯助推实体制造业转型升级 “算法定义硬件”解题AIoT市场

随着自动化的发展&#xff0c;电子商务和智能制造推动了自动化立体仓库的快速发展与创新&#xff0c;产生了“密集仓储”的概念。对于一个实体企业来讲&#xff0c;其数智物流转型正在趋向于“去伪存真”&#xff0c;企业追求高ROI与真实经济价值&#xff0c;具有降本增效的业务…

Multimodal Chain-of-Thought Reasoning in Language Models阅读笔记

论文&#xff08;2023年&#xff09;链接&#xff1a;https://arxiv.org/pdf/2302.00923.pdf GitHub项目链接&#xff1a;GitHub - amazon-science/mm-cot: Official implementation for "Multimodal Chain-of-Thought Reasoning in Language Models" (stay tuned a…

人工智能时代如何高效完成营销内容计划

智能对话升级&#xff01;【Kompas AI】AI对话助手&#xff0c;让沟通更高效 在人工智能时代&#xff0c;要高效完成营销计划&#xff0c;我们可以利用人工智能的多种能力来增强营销策略的精准度和执行效率。借助人工智能的力量&#xff0c;企业不仅可以提高营销计划的执行效率…

Wireshark 抓包

启动时选择一个有信号的网卡双击打开&#xff0c;或者在 捕获选择里打开选择网卡。 然后输出下面的规则就可以抓到报文了。 最上面的三条是建立连接时的三次握手&#xff0c; 下面是发送数据hello 对应两条数据 最下面的4条是断时的4次挥手

【蓝桥杯选拔赛真题48】C++九进制回文数 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C九进制回文数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C九进制回文数 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 提示信息&#xff1a; 回文…