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 相关文章推荐
javascript 短路法代码精简
Aug 20 Javascript
jQuery开发者都需要知道的5个小技巧
Jan 08 Javascript
jQuery之浮动窗口实现代码(两种方法)
Sep 08 Javascript
Jquery 实现弹出层插件
Jan 28 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
JS实现简易刻度时钟示例代码
Mar 11 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
Jul 20 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
Feb 04 Javascript
关于node-bindings无法在Electron中使用的解决办法
Dec 18 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
Apr 28 Javascript
微信小程序canvas开发水果老虎机的思路详解
Feb 07 Javascript
Vue列表循环从指定下标开始的多种解决方案
Apr 08 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
Terran热键控制
2020/03/14 星际争霸
图书管理程序(三)
2006/10/09 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
Vue.js 2.x之组件的定义和注册图文详解
2018/06/19 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
2018/08/08 Javascript
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
如何写辞职书
2015/02/26 职场文书
工程合作意向书范本
2015/05/09 职场文书