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]防止用户复制页面内容和另存页面的方法
Feb 06 Javascript
js onpropertychange输入框 事件获取属性
Mar 26 Javascript
jquery remove方法应用详解
Nov 22 Javascript
js四舍五入数学函数round使用实例
May 09 Javascript
JavaScript 获取任一float型小数点后两位的小数
Jun 30 Javascript
jQuery页面加载初始化的3种方法(推荐)
Jun 02 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
原生JS京东轮播图代码
Mar 22 Javascript
React 项目迁移 Webpack Babel7的实现
Sep 12 Javascript
axios取消请求的实践记录分享
Sep 26 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
Dec 13 Javascript
微信小程序日历/日期选择插件使用方法详解
Dec 28 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实现文件下载更能介绍
2012/11/23 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
Python pass详细介绍及实例代码
2016/11/24 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
解决运行出现'dict' object has no attribute 'has_key'问题
2020/07/15 Python
python爬虫爬取图片的简单代码
2021/01/18 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
Java程序员综合测试题
2014/04/25 面试题
自我鉴定写作要点
2014/01/17 职场文书
毕业自我鉴定书
2014/03/24 职场文书
集中整治工作方案
2014/05/01 职场文书
创先争优个人承诺书
2014/08/30 职场文书
2014年司法所工作总结
2014/11/22 职场文书
2014年终个人总结报告
2015/03/09 职场文书
教师求职自荐信
2015/03/26 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
MySQL 8.0 驱动与阿里druid版本兼容问题解决
2021/07/01 MySQL