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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • fec什么意思_QQ浏览器怎么使用WebRTC

    fec什么意思_QQ浏览器怎么使用WebRTCWebRTC::FEC目录WebRTC::FEC ULPFEC FLEXFEC Encodeulpfec Decodeulpfec 动态FEC冗余度 FlexFECinWebRTC WebRTC::FECTags:WebRTCFECWebRTC中的FEC实现分为UlpFEC和FlexFEC ulpfec:rfc5109 …

    2022年8月11日
    11
  • Linux常用命令详解_常用shell命令

    Linux常用命令详解_常用shell命令一、日常使用命令/常用快捷键命令开关机命令    1、shutdown–hnow:立刻进行关机     2、shutdown–rnow:现在重新启动计算机     3、reboot:现在重新启动计算机     4、su-:切换用户;passwd:修改用户密码     5、logout:用户注销常用快捷命令     1、…

    2022年8月21日
    7
  • Android IBinder的linkToDeath介绍及情景模拟

    最近查看Framework源码的时候,读到了AudioService处理音量的流程,在这里碰到了IBinder的linkToDeath()这个知识点,比较感兴趣,所以记录下来,并自己写demo尝试了一下。我们简单来看下AudioService处理静音这一块。/frameworks/base/media/java/android/media/AudioManager.javapublicclas

    2022年4月9日
    65
  • Python和Java到底有什么区别?这12点告诉你答案「建议收藏」

    Python和Java到底有什么区别?这12点告诉你答案「建议收藏」转载自品略图书馆http://www.pinlue.com/article/2020/03/1604/0310028186938.html初学编程的小伙伴在问:“Python和Java到底有什么区别?到底是学Python还是Java。“一副惆怅的样子,难以下手。今天,给大家总结了关于两者的十二点区别。一、实话实话,Python虚拟机没有java强,java虚拟机是java的核心…

    2022年7月8日
    28
  • jenkinsfile docker_docker从0创建镜像

    jenkinsfile docker_docker从0创建镜像前言之前我们用docker手动安装了jenkins环境,在jenkins中又安装了python3环境和各种安装包,如果我们想要在其他3台机器上安装,又是重复操作,重复劳动,那会显得很low,这里可以

    2022年7月31日
    9
  • Bootstrap fileinput配置「建议收藏」

    Bootstrap fileinput配置「建议收藏」$(“#file”).fileinput({showUpload:false,overwriteInitial:false,maxFileCount:5,initialPreview:[“<imgsrc=’/profile/avatar/2019/08/29/d21d8a43f67ba3d7c07be23263e1b581.jp…

    2022年5月3日
    153

发表回复

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

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