touchstart与click同时触发

touchstart与click同时触发产生冲突的原因我们可以给某个元素同时绑定touchstart和click事件,但这将会导致本篇文章解决的问题–这两个事件在移动设备上会发生冲突。由于移动设备能够同时识别touchstart和click事件,因此当用户点击目标元素时,绑定在目标元素上的touchstart事件与click事件(约300ms后)会依次被触发,也就是说,我们所绑定的回调函数会被执行两次!。…

大家好,又见面了,我是你们的朋友全栈君。

产生冲突的原因

我们可以给某个元素同时绑定 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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150780.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 图片base64 转 pdf

    java 图片base64 转 pdf思路 base64 gt multipartFil gt pdfbase64 gt multipartFil 将图片 base64 gt MultipartFil parambase64 return publicstatic Stringbase64 try String baseStr base64 spli

    2025年6月24日
    5
  • c语言length函数,length_length什么意思[通俗易懂]

    c语言length函数,length_length什么意思[通俗易懂]length什么意思length[英][leŋθ][美][lɛŋkθ,lɛŋθ]n.长度,长;时间的长短;(语)音长;一段,一节复数:lengths1.Abookisnotjudgedonlyonitslength.不能只根据篇幅长短来评价一本书。2.Ahallranthelengthoftheupperfloorofthehouse.走廊的长度等于房子…

    2022年5月18日
    60
  • tabnine激活码-激活码分享

    (tabnine激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~V…

    2022年3月22日
    86
  • 女生学Java软件开发好就业吗

    女生学Java软件开发好就业吗  java在IT行业非常火热,近几年不仅引起了很多人的关注,女性同胞也非常关注这一行业,想要学习java技术,但是不知道女生学Java软件开发好就业吗?来看看下面的详细介绍就知道了。  女生学Java软件开发好就业吗?目前大多数想要参加Java培训学习女生的一个重要关注的话题,学习不用多说,只要是自己足够的努力,在选择一个靠谱的Java培训机构,还是比较容易学会的。有的时候我们可以看到同样的老师、同样的课程和同样的学习方式,整个Java培训过程下来女生很多是要比男生学习的更好。  所以,在学习

    2022年7月8日
    17
  • isset,empty,is_null小知识

    isset,empty,is_null小知识

    2022年1月2日
    46
  • 银行家算法C++实现

    银行家算法C++实现网上有很多银行家算法的源代码,下面是本人自己写的,基本算法模型参考教材。介绍银行家算法(Banker’sAlgorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉(EdsgerWybeDijkstra)在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。背景简介在银行中…

    2022年7月22日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号