vue中touch和click共存的解决方式


Posted in Javascript onJuly 28, 2020

在vue开发手机端项目时,我们经常会遇到touch和click共存的情况,比如城市选择页面的字母滑动

vue中touch和click共存的解决方式

touch事件在手机端会触发浏览器滑动,所以应给touch事件添加阻止默认行为touchmove.prevent。注意阻止默认行为事件不要添加在touchstart事件上,会影响到click事件的发生。

touch事件和click事件发生先后顺序:

touchstart,touchmove,touchend,click

补充知识:touchstart与click同时触发

产生冲突的原因

我们可以给某个元素同时绑定 touchstart 和 click 事件,但这将会导致本篇文章解决的问题 ? 这两个事件在移动设备上会发生冲突。

由于移动设备能够同时识别 touchstart 和 click 事件,因此当用户点击目标元素时,绑定在目标元素上的 touchstart 事件与 click 事件(约300ms后)会依次被触发,也就是说,我们所绑定的回调函数会被执行两次!。这显然不是我们想要的结果。

解决方案

(1)原生JS

方法一:

使用事件对象中的 preventDefault 方法,preventDefault 方法的作用在于:阻止元素默认事件行为的发生,但有意思的是,当我们在目标元素同时绑定 touchstart 和 click 事件时,在 touchstart 事件回调函数中使用该方法,可以阻止后续 click 事件的发生。

const Button = document.getElementById("targetButton")
Button.addEventListener("touchstart", e => {
 e.preventDefault()
 console.log("touchstart event!")
})
 
Button.addEventListener("click", e => {
 e.preventDefault()
 console.log("click event!")
})

方法二:

基于功能检测绑定事件

我们可以通过判断浏览器是否支持 touchstart 事件来封装元素的点击事件,这样客户端会根据当前环境判定元素应该绑定的事件类型,代码如下:

const Button = document.getElementById("targetButton")
const clickEvent = (function() {
 if ('ontouchstart' in document.documentElement === true)
 return 'touchstart';
 else
 return 'click';
})();
 
Button.addEventListener(clickEvent, e => {
 console.log("things happened!")
})

(2) VUE解决方案:

HTML

<div class="comment-text" 
   @touchstart.prevent="gtouchstart(XXX)"
   @touchend.prevent="triggerReply(XXXX)">
   {{ item.content}}
 </div>

JS

data: function () {
  return {
     Loop: 0
   };
 }
gtouchstart: function (XXXX) {
    let self = this;
    //执行长按的内容
    self.Loop = setTimeout(function () {
      self.Loop = 0;
      //XXXXXXXXXXXXXXX
    }, 500);
    return false;
  },
  triggerReply: function (XXXX) {
    let self = this;
    clearTimeout(self.Loop);
    //这里click内容
    if (self.Loop !== 0) {
       //XXXXXXXXXXXXXXX
    }
    return false;
  },

添加 touchstart.prevent,组织click事件。

点击事件顺序

点击事件可以分解成多个事件

在移动端,手指点击一个元素,会经过:touchstart --> touchmove -> touchend -->click

以上这篇vue中touch和click共存的解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
根据表格中的某一列进行排序的javascript代码
Nov 29 Javascript
JavaScript中的包装对象介绍
Jan 27 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
May 25 Javascript
支持移动端原生js轮播图
Feb 16 Javascript
JavaScript和JQuery获取DIV值的方法示例
Mar 07 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
Aug 23 jQuery
极简主义法编写JavaScript类
Nov 02 Javascript
从零使用TypeScript开发项目打包发布到npm
Feb 14 Javascript
vue 路由守卫(导航守卫)及其具体使用
Feb 25 Javascript
在Echarts图中给坐标轴加一个标识线markLine
Jul 20 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
Oct 24 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
Jul 28 #Javascript
JavaScript中window和document用法详解
Jul 28 #Javascript
vue中echarts引入中国地图的案例
Jul 28 #Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
Jul 28 #Javascript
JavaScript文档加载模式以及元素获取
Jul 28 #Javascript
javascript实现贪吃蛇小游戏
Jul 28 #Javascript
Element DateTimePicker日期时间选择器的使用示例
Jul 27 #Javascript
You might like
PHP数据缓存技术
2007/02/14 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
php微信开发之谷歌测距
2018/06/14 PHP
PHP Include文件实例讲解
2019/02/15 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
ext form 表单提交数据的方法小结
2008/08/08 Javascript
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python中实现三目运算的方法
2015/06/21 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
python 绘制国旗的示例
2020/09/27 Python
python利用opencv保存、播放视频
2020/11/02 Python
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
专业实习自我鉴定
2013/10/29 职场文书
通信工程专业求职信
2014/06/04 职场文书
单位活动策划方案
2014/08/17 职场文书
个人授权委托书范本
2014/09/14 职场文书
法定代表人授权委托书
2014/09/19 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
CocosCreator入门教程之网络通信
2021/04/16 Javascript
go goth封装第三方认证库示例详解
2022/08/14 Golang