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


相关推荐

  • 解决 无法读取到 /data/data/yourPackageName/files/coverage.ec 文件

    解决 无法读取到 /data/data/yourPackageName/files/coverage.ec 文件参考https://testerhome.com/topics/8554这篇文章jacoco生成coverage.ec在/data/data/yourPackageName/files/下,通过adb pull该目录,提示该文件不存在 因无Root权限  需定义一下下coverage.ec文件的存放路径在该文章JacocoInstrumentation

    2022年7月20日
  • CNN卷积神经网络原理讲解+图片识别应用(附源码)[通俗易懂]

    CNN卷积神经网络原理讲解+图片识别应用(附源码)[通俗易懂]一、机器如何识图先给大家出个脑筋急转弯:在白纸上画出一个大熊猫,一共需要几种颜色的画笔?——大家应该都知道,只需要一种黑色的画笔,只需要将大熊猫黑色的地方涂上黑色,一个大熊猫的图像就可以展现出来。我们画大熊猫的方式,其实和妈妈们的十字绣很接近——在给定的格子里,绣上不同的颜色,最后就可以展现出一幅特定的“图片”。而机器识图的方式正好和绣十字绣的方式相反,现在有了一幅图片,机器通过识别图片中…

    2022年6月14日
  • JVM调优工具「建议收藏」

    JVM调优工具「建议收藏」JVM调优工具Jconsole:jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。JProfiler:商业软件,需要付费。功能强大。VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。如何调优观察内存释放情况、集合类检查、对象树上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能堆信息查…

    2022年6月1日
  • Ajax教程_ajax是服务器端动态网页技术

    Ajax教程_ajax是服务器端动态网页技术Ajax教程Ajax能做什么Ajax是一种异步请求数据的web开发技术,目前主要用于异步,大家都知道,浏览器主线程是单线程的,也就是一次只能干一件事,以Ajax就是让浏览器当主线程完成后去干别的事

    2022年8月4日
  • mac phpstorm激活码2022【2022.01最新】2022.02.27

    (mac phpstorm激活码2022)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html2KLKA7BQFO-eyJsaWNlbnNlSW…

    2022年4月1日
  • 《算法和数据结构》学习路线指引

    前WorldFinal选手对学习算法的一点总结。五张思维导图解决你的困惑

    2022年4月9日

发表回复

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

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