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


相关推荐

  • linux smartctl 命令,Smartctl 命令查看硬盘详细信息

    linux smartctl 命令,Smartctl 命令查看硬盘详细信息Smartctl命令查看硬盘详细信息(2011-08-3014:21:41)标签:linux硬盘信息使用时间杂谈1.1什么是Smartmontools?Smartmontools是一种硬盘检测工具,通过控制和管理硬盘的SMART(SelfMonitoringAnalysisandReportingTechnology,自动检测分析及报告技术)技术来实现的,SMART技术可以对硬盘的磁头单…

    2022年6月17日
    53
  • goland 2021.01激活码【永久激活】

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

    2022年3月22日
    272
  • java 打印pdf_java打印pdf文件

    java 打印pdf_java打印pdf文件目录一、Java的打印简介二、Java打印实现2.1JPG图片文件格式打印实现2.2PDF文件格式打印实现2.3Word文件格式打印实现2.3.1Word文件采用jacob插件进行打印实现。2.3.2先将word转化为pdf文件,然后打印pdf(lz使用)三、总结一、Java的打印简介在我们的实际工作中,经常需要实现打印功能。但由于历史原因,Jav…

    2025年9月17日
    5
  • win10系统显示打印机未连接到服务器,win10系统无法打印提示似乎未连接打印机的解决方法…

    win10系统显示打印机未连接到服务器,win10系统无法打印提示似乎未连接打印机的解决方法…电脑对日常生活的重要性小编就不多说了,可是一旦遇到win10系统无法打印提示似乎未连接打印机的情况,想必大家都遇到过win10系统无法打印提示似乎未连接打印机的情况吧,那么应该怎么处理win10系统无法打印提示似乎未连接打印机呢?我们依照首先我们需要检查一下打印机的驱动是否正常,右键点击桌面上的“此电脑”图标,在弹出菜单中选择“属性”菜单项,这时会打开Windows10系统的系统窗口,点击左侧边栏…

    2022年4月29日
    130
  • 细说SDRAM控制器

    细说SDRAM控制器SDRAM的基本概念SDRAM凭借其极高的性价比,广泛应用于高速数据存储、实时图像处理等设计当中,但是相对于SRAM、FIFO等其他存储器件,SDRAM的控制相对复杂。虽说是复杂,但也不代表没办法实现,仔细梳理一下,发现SDRAM的控制其实也没这么难。本文就SDRAM的基本概念以及其工作流程做简要介绍。SDRAM的基本信号:SDRAM的基本信号(电源以及地线在这里不讨论)可以…

    2022年7月25日
    11
  • 微商城分销系统:微商运营管理系统搭建介绍

    微商城分销系统:微商运营管理系统搭建介绍“互联网+”时代背景下,计算机信息处理技术的数据技术已经无法满足日益增长的数据存储需求。因此,工作人员要大力发开计算机信息处理技术的数据存储功能,促进存储技术发展,推动计算机信息处理技术在“互联网”时代中进步与发展。计算机信息处理技术的信息存储技术,是计算机在对信息数据进行加工后,将其保存在计算机系统的空间中,为使用者后期调取和查看做准备。微商城分销系统能够准确即时管理分销商,掌握分销商的销售情况,从而了解产品的销售情况,重要的是不仅实现了产品的销售与推广,还可以根据消费者的需求来改变产品的供求,了解市场

    2022年5月16日
    31

发表回复

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

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