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通用函数
May 09 Javascript
javascript中的float运算精度实例分析
Aug 21 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
Jun 26 Javascript
javascript实现window.print()去除页眉页脚
Dec 30 Javascript
Json解析的方法小结
Jun 22 Javascript
AngularJS+Bootstrap实现多文件上传与管理
Nov 08 Javascript
详解React-Todos入门例子
Nov 08 Javascript
纯javascript版日历控件
Nov 24 Javascript
微信小程序实现打卡日历功能
Sep 21 Javascript
微信小程序 扭蛋抽奖机css3动画实现详解
Jul 19 Javascript
vue如何使用async、await实现同步请求
Dec 09 Javascript
vue项目支付功能代码详解
Feb 18 Vue.js
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+MySql编写聊天室
2006/10/09 PHP
深入PHP变量存储的详解
2013/06/13 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
python实现人人网登录示例分享
2014/01/19 Python
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
python根据时间获取周数代码实例
2019/09/30 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
Python自动化操作实现图例绘制
2020/07/09 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
数控技术应届生求职信
2013/11/13 职场文书
学习决心书范文
2014/03/11 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
暑期家教宣传单
2015/07/14 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang