时间:2021-05-26
在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共存的解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在ios端,safari浏览器上触发click事件有300ms的延迟相应,为touch添加的样式会和click冲突而出现闪烁问题在safari中触摸事件的相应顺
ios中audio不能直接通过audio.play()播放,需要用户在click事件或者touch事件中执行audio.play()才能播放。ajax回调中au
1.最近得到一个新需求,需要在Vue项目的移动端页面上加上左右滑动效果,在网上查阅资料,最终锁定了vue-touch2.下载vue-touch(https://
1、Vue.js事件绑定的一般格式v-on:click='function'v-on:click/mouseout/mouseover/@click2、Vue.
上网上翻了翻,共找到两种方式CSS样式控制,只需将下面代码复制到vue应用下,index.html文件中的body标签上*{-webkit-touch-call