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 相关文章推荐
jQuery Ajax之$.get()方法和$.post()方法
Oct 12 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
Jun 05 Javascript
tuzhu_req.js 实现仿百度图片首页效果
Aug 11 Javascript
详解JavaScript的Date对象(制作简易钟表)
Apr 07 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 Javascript
JS实现n秒后自动跳转的两种方法
Nov 30 Javascript
AngularJS Toaster使用详解
Feb 24 Javascript
基于javaScript的this指向总结
Jul 22 Javascript
vue axios请求拦截实例代码
Mar 29 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
JavaScript两种计时器的实例讲解
Jan 31 Javascript
对layui初始化列表的CheckBox属性详解
Sep 13 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 Opcache安装和配置方法介绍
2015/05/28 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
javascript新手语法小结
2008/06/15 Javascript
javascript 日历提醒系统( 兼容所有浏览器 )
2009/04/07 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
js获取class的所有元素
2013/03/28 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
2018/03/21 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
[06:35]2014DOTA2国际邀请赛 老男孩梦圆西雅图中国军团世界最强
2014/07/22 DOTA
Python验证码识别处理实例
2015/12/28 Python
Python编码类型转换方法详解
2016/07/01 Python
Python扩展内置类型详解
2018/03/26 Python
python 字符串只保留汉字的方法
2018/11/16 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
餐饮营销方案
2014/02/23 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
庆六一活动总结
2014/08/29 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
《学会看病》教学反思
2016/02/17 职场文书
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js