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 相关文章推荐
IE8 浏览器Cookie的处理
Jan 31 Javascript
一个简单的JavaScript 日期计算算法
Sep 11 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
Jun 10 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
jquery+ajax+text文本框实现智能提示完整实例
Jul 09 Javascript
js中Number数字数值运算后值不对的解决方法
Feb 28 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 Javascript
Java设计中的Builder模式的介绍
Mar 22 Javascript
JavaScript实现百度搜索框效果
Mar 26 Javascript
基于vue实现可搜索下拉框定制组件
Mar 26 Javascript
JS实现的tab页切换效果完整示例
Dec 18 Javascript
JS实现按比例缩小图片宽高
Aug 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初学入门
2006/11/19 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
JavaScript匿名函数之模仿块级作用域
2015/12/12 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
前端天气插件tpwidget使用方法详解
2019/06/24 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
使用python 获取进程pid号的方法
2014/03/10 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
transform python环境快速配置方法
2018/09/27 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
Python调用Redis的示例代码
2020/11/24 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
灰雀教学反思
2014/04/28 职场文书
2014年底个人工作总结
2015/03/10 职场文书
求职简历自我评价2015
2015/03/10 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
导游词之镇江焦山
2019/11/21 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
TS 类型兼容教程示例详解
2022/09/23 Javascript