bug修复---同时触发mousedown事件和touchstart事件

news/2024/7/10 3:03:45 标签: vue, js

这两天遇到一个bug,每次点击下方键盘时,点击一次数字,文本框中会出现两次重复值,如下所示:
在这里插入图片描述
而且console中还有以下报错信息:
在这里插入图片描述
查看项目代码,代码如下:

<ul>
  <li
    v-for="(item, index) in keys"
    :key="index"
    v-html="item.name"
    @mousedown="handleKeyboardClick(item.val, index)"
    @touchstart="handleKeyboardClick(item.val, index)"
    @mouseup="stateChange(index)"
    @touchend="stateChange(index)">
  </li>
</ul>

因为该页面要适配PC和APP,所以绑定了mousedowntouchstart两个事件,猜测出现此问题的原因是在某些手机上同时触发了mousedowntouchstart事件。

通常事件的处理顺序为:

touchstart touchmove touchend mousemove mousedown mouseup click

经过调试发现确实同时触发了两个事件,下面是解决思路:

1.添加stop事件修饰符阻止冒泡

@touchstart.stop="handleKeyboardClick(item.val, index)"

结果:console中没有报错信息,但是依然还是会触发两次。

2.添加preventDefault方法

1)在handleKeyboardClick方法中添加e.preventDefault();,只是添加了这一行代码,没有添加参数e,这样console控制台中会报错,但是文本框中只显示一次。

方案一:

handleKeyboardClick: function(code, index) {
  e.preventDefault();
}

结果:
在这里插入图片描述
方案二:

handleKeyboardClick: function(code, index, e) {
  e.preventDefault();
}

结果:
在这里插入图片描述
2)在touchstart事件中添加上$event

@touchstart="handleKeyboardClick(item.val, index, $event)”,console不报错,但是文本框显示两个一样的数字。

3.终极解决方案:把mousedowntouchstart两个事件拆开,判断设备,是PC的话调用mousedown事件,否则调用touchstart事件,这样可以解决该问题,但是缺点就是增加了重复代码。

<ul v-if="isPC">
  <li
    v-for="(item, index) in keys"
    :key="item.val"
    v-html="item.name"
    @mousedown="handleKeyboardClick(item.val, index)"
    @mouseup="stateChange(index)">
  </li>
</ul>
<ul v-else>
  <li
    v-for="(item, index) in keys"
    :key="item.val"
    v-html="item.name"
    @touchstart="handleKeyboardClick(item.val, index)"
    @touchend="stateChange(index)">
  </li>
</ul>


http://www.niftyadmin.cn/n/1659440.html

相关文章

Flex布局指南

Flexbox布局概念 Flexbox布局&#xff08; Flexible Box 或CSS3 弹性布局&#xff09;&#xff0c;是CSS3中的一种新的布局模式&#xff0c;是可以自动调整子元素的高和宽&#xff0c;来很好的填充任何不同屏幕大小的显示设备中的可用显示空间&#xff0c;收缩内容防止内容溢出…

HTML页面通过iframe嵌套Vue项目

之前都是在Vue项目中通过iframe嵌套外部写好的HTML页&#xff0c;但是最近接触了一个需求&#xff0c;是需要在HTML页面中嵌入Vue项目。 Vue项目打包完成之后会形成一个包含所有静态资源的文件夹&#xff0c;点击HTML页可以运行&#xff08;后端解决的跨域&#xff09;&#x…

Flex基本原理(图示解析)

新版的flexbox规范分两部分&#xff1a;一部分是container&#xff0c;一部分是 items。flexbox是一整套布局规范&#xff0c;包含了多个css属性&#xff0c;所以学习起来比float: left; 这样简单的布局要复杂很多。基本原理 容器上有 主轴和纵轴的概念&#xff0c;默认主轴&am…

Javascript高级程序设计——15-1.匿名函数和闭包

1、匿名函数 表示没有定义函数名的函数 案例1-1&#xff1a;简单的匿名函数 function (){ //单独的匿名函数无法执行&#xff1b;alert(Lee); }案例1-2&#xff1a;将匿名函数赋值给一个变量 var boxfunction(){return Lee; }; alert(box());案例1-3&#xff1a;通过自我执行…

项目:多用户留言系统——进程(1)分离调用

1、分离首尾 在XHTML1.0文件中所编辑的前端首页界面中&#xff0c;id为“header、footer”的相关内容分离开来&#xff0c; 编辑为.php文件。 "header"——header.inc.php "footer"——footer.inc.php 同时在原XHTML1.0文件部分&#xff0c;被剪切掉的…

Mac本地向服务器(经跳板机)上传文件的多种方案

在项目开发的过程中&#xff0c;偶尔会遇到需要手动把本地的文件上传到服务器的情况&#xff0c;本次整了一下上传的多种方案&#xff0c;做一下总结。 1.Mac下可以使用rz和sz 由于服务器的登陆需要经过跳板机&#xff0c;所以采用rz和sz的方式&#xff0c;但是需要自己配置&…

项目:多用户留言系统——进程(2)执行耗时

1、运行耗时时间 &#xff08;1&#xff09;microtime() 该函数用于返回当前的时间戳和微妙数 $_mtimeexplode(,microtime()); $_mtime[1]$_mtime[0]; &#xff08;2&#xff09;通过睡眠函数来进行测试 usleep(2000000); //表示睡眠2s 2、创建核心函数库 创建一个文件&a…

PC调试手机上APP的多种方式

与Web端调试相比&#xff0c;移动端调试似乎有很大难度&#xff0c;之前尝试过使用alert&#xff0c;页面引入vconsole的方式&#xff0c;最近又发现了其他更加方便的调试&#xff0c;顺道整理下来。 1.Chrome浏览器Inspect调试 1&#xff09;在x5内核下&#xff0c;访问debu…