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 相关文章推荐
JS类定义原型方法的两种实现的区别评论很多
Sep 12 Javascript
javascript下function声明一些小结
Dec 28 Javascript
Prototype源码浅析 String部分(二)
Jan 16 Javascript
jquery 缓存问题的几个解决方法
Nov 11 Javascript
jQuery中:nth-child选择器用法实例
Dec 31 Javascript
jQuery scrollFix滚动定位插件
Apr 01 Javascript
javascript中this的四种用法
May 11 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
Oct 26 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
Aug 24 Javascript
解决vue同一slot在组件中渲染多次的问题
Sep 06 Javascript
Vue 根据条件判断van-tab的显示方式
Aug 03 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的call_user_func传reference引发的思考
2010/07/23 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
Python进行统计建模
2020/08/10 Python
一文彻底解决HTML5页面中长按保存图片功能
2019/06/10 HTML / CSS
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
幼儿教师考核制度
2014/01/25 职场文书
差生评语大全
2014/05/04 职场文书
工程部经理岗位职责
2015/02/02 职场文书
销售经理工作检讨书
2015/02/19 职场文书
小学中队长竞选稿
2015/11/20 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android