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生成asp.net服务器控件的代码
Feb 04 Javascript
JQuery中getJSON的使用方法
Dec 13 Javascript
关于jQuery的inArray 方法介绍
Oct 08 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
Oct 24 Javascript
详解js中class的多种函数封装方法
Jan 03 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
Jan 23 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 jQuery
weex slider实现滑动底部导航功能
Aug 28 Javascript
解析Vue 2.5的Diff算法
Nov 28 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
解决layui富文本编辑器图片上传无法回显的问题
Sep 18 Javascript
jQuery实现获取多选框的值示例
Feb 07 jQuery
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
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
js实现编辑div节点名称的方法
2014/12/17 Javascript
浅谈jQuery构造函数分析
2015/05/11 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
Vue.use源码分析
2017/04/22 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
nodejs中方法和模块用法示例
2018/12/24 NodeJs
彻底搞懂并解决vue-cli4中图片显示的问题实现
2020/08/31 Javascript
Python实现从URL地址提取文件名的方法
2015/05/15 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
详解flask表单提交的两种方式
2018/07/21 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
python爬虫使用requests发送post请求示例详解
2020/08/05 Python
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
管理部部长岗位职责
2013/12/05 职场文书
管理专员自荐信
2014/01/26 职场文书
活动志愿者自荐信
2014/01/27 职场文书
中学生自我鉴定
2014/02/04 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
担保书格式
2015/01/20 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
工作感想范文
2015/08/07 职场文书
2019年思想汇报
2019/06/20 职场文书
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
详解SQL报错盲注
2022/07/23 SQL Server