当前位置: 首页 > news >正文

click和touch事件触发顺序 糊里糊涂解决的奇怪bug

问题详情

在嵌入式硬件设备里,测试 “点击input密码框,弹出第三方自带键盘,点击密码框旁的小眼睛,切换输入内容加密状态,键盘收起/弹出状态不变” 的功能逻辑;实际情况却是 “点击键盘或input框之外的任何地方,键盘都会收起” 。

 <div class="w-440 h-90 items-center"><text class="fs-24 fw-500 mr-20">密码/text><input id="input" type="{{type}}" value="{{inputvalue}}" class="w-232 h-90 fs-24 bg-cardBg items-center input-style"style="keyboard: {{ keyboardStyle }}; width: {{ inputwidth }}px;" placeholder="{{placeholder}}"onclick="handleClick" /></div><div onclick="changeType" class="w-98 h-90 absolute" style="top: -2px; right: -2px;"><image if="{{showPassword}}" src="{{'/common/images/eye.png'}}" class="absolute top-25 right-24 w-41 h-41"></image><image else src="{{'/common/images/eye-close.png'}}" class="absolute top-25 right-24 w-41 h-41"></image></div>/////changeType(event) {this.showPassword = !this.showPassword;event.stopPropagation(); // 阻止冒泡},

在这里插入图片描述
(页面编写基于Vela JS框架)

问题分析

由于是第三方键盘,暂时看不到其底层处理方式,初步判断出两个逻辑,一是键盘的弹出和input框的focus事件相关,二是键盘弹出时,会默认在整屏生成蒙层,用户点击时触发蒙层绑定的交互事件,判断如果是非input框范围,则收起键盘(大众逻辑)

解决思路

思路1:不去考虑第三方键盘的底层处理方式,在用户点击小眼睛时,强制触发input框的focus事件

 changeType(event) {this.showPassword = !this.showPassword;if (this.focus) {this.$element("input").focus({focus: true})}event.stopPropagation(); // 阻止冒泡},

结果导致,点击小眼睛时键盘闪烁?外加需要点击两次小眼睛才会切换小眼睛的状态,就像是生成了两个蒙层,点两次才能点到小眼睛(看不到源代码,咱也是瞎猜)

思路2:如果蒙层上绑定的是onclick事件(大众逻辑),我们可以在小眼睛上绑定一个比onclick事件更快响应的事件,并在事件处理函数内,阻止事件冒泡/穿透到蒙层

这里就涉及到,click和touch事件的触发顺序了

事件触发顺序:touchstart → touchmove → touchend → click
click与touchstart触发时间差约300ms,因需区分双击和单击

我们虽然无法确认蒙层是位于小眼睛的上层还是下层,但只要小眼睛上事件能触发,我们就可以将小眼睛上绑定的事件改为最快响应的touchstart,并阻止事件冒泡/穿透

 <div ontouchstart="changeType" class="w-98 h-90 absolute" style="top: -2px; right: -2px;">...</div>/// changeType(event) {this.showPassword = !this.showPassword;if (this.focus) {this.$element("input").focus({focus: true})}event.stopPropagation(); // 阻止冒泡event.preventDefault(); // 阻止默认事件},

问题解决了!键盘不闪了,小眼睛也能正常点击

但是又想到小眼睛的点击没有默认事件需要阻止,就把event.preventDefault();删了,测试无影响;又想到event.stopPropagation();生效的前提是,蒙层是小眼睛的祖先元素,为了确认又把event.stopPropagation();删了,发现也没有影响…

奇怪啊,所以解决这个问题的关键,仅仅只是将click改为了touchstart?难道小眼睛的闪烁是click的300ms延迟导致的?想不明白了…

结果就这么简单解决了…

 <div ontouchstart="changeType" class="w-98 h-90 absolute" style="top: -2px; right: -2px;">...</div>/// changeType(event) {this.showPassword = !this.showPassword;if (this.focus) {this.$element("input").focus({focus: true})}},
http://www.lryc.cn/news/604745.html

相关文章:

  • VUE -- 基础知识讲解(三)
  • 前端安全防护:XSS、CSRF与SQL注入漏洞深度解析与防御
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | 3dBackgroundBoxes(3D背景盒子组件)
  • 前端兼容性问题全面解决方案
  • Vue2-封装一个看起来像左右分布表格的表单组件
  • JetBrains Annotations:从入门到落地,彻底告别 NullPointerException
  • 2025年GEO服务商有哪些?——从技术到服务的专业分析
  • 2507C++,介绍名字对象
  • Java Stream核心:ReferencePipeline解析
  • 【WPS】邮件合并教程\Excel批量写入数据进Word模板
  • 滚珠导轨在电子制造中的流畅性优势
  • 新零售“实—虚—合”逻辑下的技术赋能与模式革新:基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的研究
  • 洛谷 P11230:[CSP-J 2024 T4] 接龙 ← 图论+动态规划
  • 北京-4年功能测试2年空窗-报培训班学测开-第六十四天-准备面试项目(焦虑)-同学开始面试
  • 汽车免拆诊断案例 | 免拆诊断发动机起动困难故障2例
  • Linux730 tr:-d /-s;sort:-r,-n,-R,-o,-t,-k,-u;bash;cut:-d,-c;tee -a;uniq -c -i
  • VS Code中如何关闭Github Copilot
  • 深度学习-丢弃法 Dropout
  • MySQL索引和事务笔记
  • 开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放
  • WPFC#超市管理系统(3)商品管理
  • 【科研绘图系列】R语言绘制绝对量柱状堆积图+环形图数量统计+特数量标注
  • 潇洒郎: Kafka Ubuntu 安装部署,命令行或者python生产数据与消费数据(kafka-python)
  • 【选型】HK32L088 与 STM32F0/L0 系列 MCU 参数对比与选型建议(ST 原厂 vs 国产芯片)
  • 2025年6月数据挖掘顶刊TKDE研究热点有哪些?
  • 传输层协议UDP与TCP
  • 周期滤波策略
  • AbMole小课堂丨bFGF(FGF-2):维持干细胞培养、驱动类器官构建与细胞分化
  • 容器与虚拟机的本质差异:从资源隔离到网络存储机制
  • 如何使用 Apache Ignite 作为 Spring 框架的缓存(Spring Cache)后端