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


相关推荐

  • Elasticsearch-精确查找

    Elasticsearch-精确查找

    2021年11月26日
    50
  • 基于Kubernetes集群的Jenkins CI/CD版本上线流程部署

    基于Kubernetes集群的Jenkins CI/CD版本上线流程部署基于kubernetes平台的CICD持续集成文章目录基于kubernetes平台的CICD持续集成1.基于k8s集群的Jenkins持续集成2.将Jenkins部署在k8s集群2.1.编写Jenkinsnamespace文件2.2.编写Jenkinsrbac授权文件2.3.编写Jenkinsstatefulset资源文件2.4.编写JenkinsStorageClass资源文件2.5.编写Jenkinssvc资源文件2.6.准备Jenkins镜像并推送至harbor2.7.创建所有资源并查看资

    2022年6月2日
    41
  • vscode设置字体大小和字体_vscode snippet

    vscode设置字体大小和字体_vscode snippetvscode设置字体vscode设置字体查看vscode当前的字体github搜索自己喜欢的字体设置vscode字体配置vscode设置字体安装下载完成后总感觉字体不好看,想换别的字体,怎么办,只需要如下几步即可搞定查看vscode当前的字体****如上图,我得vscode字体是已经设置过的,vscode默认字体是Consolas格式的,我个人不太喜欢,所以就从网上下载别的字体。github搜索自己喜欢的字体比如我下载的就是Hack字体,github上直接搜索Hack字体是直接可以下载安装

    2022年4月19日
    376
  • 回溯法求解N皇后问题及其时间复杂度分析

    回溯法求解N皇后问题及其时间复杂度分析回溯法求解N皇后问题及其时间复杂度分析一、回溯法简介1.什么是回溯法?2.回溯法的时间复杂度分析蒙特卡罗方法蒙特卡罗方法在回溯法求解时间复杂度中的应用二、回溯法求解N皇后问题1.回溯法求解N皇后问题的过程2.回溯法求解N皇后问题的时间复杂度2.1求解时的效率分析回溯法进行效率分析的代码2.2时间复杂度分析一、回溯法简介1.什么是回溯法?  相信”迷宫”是许多人儿时的回忆,大家小时候一定都玩过迷宫游戏。我们从不用别人教导,都知道走迷宫的策略是:当遇到一个岔路口,会有以下两种情况:存

    2022年9月30日
    5
  • Java基础编程练习题

    Java基础编程练习题很多人在自学java的时候看一遍视频,感觉就会了,课后并没有大量的练习来巩固当前所学的知识点,今天给大家整理了一些非常具有代表意义的题。Java基础类型题1、反转一个只有3位数的整数。从控制台输入321,输出1232、将一个字符由小写字母转换为大写字母。从控制台输入a,输出A3、从控制台输入一个字符串,由字母组成,转换成大写后输出。如果输入的是小写,就转换成大写。…

    2022年10月12日
    3
  • 关于三极管的理解—根据IC符号简易迅速判断三极管导通情况

    关于三极管的理解—根据IC符号简易迅速判断三极管导通情况  很不幸,开始写博客的第一天就被师兄批评了。其实很对不起师兄,当年在大学学习模拟电路的时候我不太认真,那时候天天忙着和女朋友吃吃喝喝。。所以对于三极管的各种性质与基本运用场景缺乏较深的理解,仅仅只是知道导通、截止等几种判断方式而已。今天在设计电路时涉及到了运用三极管驱动光耦器件,以及通过三极管来驱动蜂鸣器等操作,在三极管的选材和设计上出现了低级的失误。检讨完毕后,翻出当年的模电书,配…

    2022年6月17日
    44

发表回复

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

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