在vue开发手机端项目时,我们经常会遇到touch和click共存的情况,比如城市选择页面的字母滑动touch事件在手机端会触发浏览器滑动,所以应给touch事件添加阻止默认行为touchmove.prevent。注意阻止默认行为事件不要添加在touchstart事件上,会影响到click事件的发生。touch事件和click事件发生先后顺序:touch事件和click事件发生先后顺序:
touchstart,touchmove,touchend,click
touchstart,touchmove,touchend,click补充知识:touchstart与click同时触发补充知识:补充知识:touchstart与click同时触发产生冲突的原因产生冲突的原因我们可以给某个元素同时绑定 touchstart 和 click 事件,但这将会导致本篇文章解决的问题 – 这两个事件在移动设备上会发生冲突。由于移动设备能够同时识别 touchstart 和 click 事件,因此当用户点击目标元素时,绑定在目标元素上的 touchstart 事件与 click 事件(约300ms后)会依次被触发,也就是说,我们所绑定的回调函数会被执行两次!。这显然不是我们想要的结果。解决方案解决方案(1)原生JS(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!")
})
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!")
})


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解决方案:(2) VUE解决方案:HTML


@touchstart.prevent="gtouchstart(XXX)"

@touchend.prevent="triggerReply(XXXX)">

{{ item.content}}



@touchstart.prevent="gtouchstart(XXX)"

@touchend.prevent="triggerReply(XXXX)">

{{ item.content}}
JSJS
data: function () {

return {

Loop: 0

};
}
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;

},

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共存的解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考。