vue的touchStart事件及click事件冲突问题

vue的touchStart事件及click事件冲突问题一问题:今天遇到这样问题,给某个元素同事绑定touchStart及click事件后,若在移动设备上,当你点击时,会依次出发这两个事件。因为移动端的click事件触发是会延迟300ms,所以touchStart事件会先触发后再触发click事件。这样导致每次都要执行两次…

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

一 、问题:

今天遇到这样问题,给某个元素同时绑定touchStart及click事件后,若在移动设备上,当你点击时,会依次出发这两个事件。因为移动端设备上的click事件触发是会延迟300ms,所以touchStart事件会先触发后再触发click事件。这样导致每次都要执行两次,这样毫无意义。这里提醒下,PC是无法识别touch相关事件

二、解决方式

(1)preventDefault方法
通过使用preventDefault方法(阻止元素默认事件行为的发生)来解决。在touchstart中添加 e.preventDefault()就可以阻止click事件触发。
模板

  <ul class="list">
    <li class="item" v-for="item of letters"
    :key="item"
    :ref="item"
    @touchstart="handleTouchStart"
    @click="handleleterClick"
    >{
  
  {item}}</li>
  </ul>

上面模板可以使用vue事件修饰符@touchstart.stop.prevent实现,但method中的handleTouchStart 就无需添加 e.preventDefault();

  <ul class="list">
    <li class="item" v-for="item of letters"
    :key="item"
    :ref="item"
    @touchstart.stop.prevent="handleTouchStart"
    @click="handleleterClick"
    >{
  
  {item}}</li>
  </ul>
  methods: {
    handleleterClick (e) {
      console.log('click事件执行一次')
      this.$emit('change', e.target.innerText)
    },
    handleTouchStart (e) {
     console.log('TouchStart执行一次')
      e.preventDefault()//添加阻止click事件触发
      this.touchStatus = true
    }
  }
}

未添加 e.preventDefault()前打印结果
在这里插入图片描述
添加 e.preventDefault()后打印结果
在这里插入图片描述

(2)判断浏览器是否支持触屏事件
通过”ontouchend” in document来判断浏览器是否支持触屏事件,若支持调用touch事件,不支持调用click事件。

  <ul class="list">
    <li class="item" v-for="item of letters"
    :key="item"
    :ref="item"
    @click="handleSelfClick"
    >{
  
  {item}}</li>
  </ul>
 methods: {
    handleleterClick (e) {
      console.log('click事件执行一次')
      this.$emit('change', e.target.innerText)
    },
    handleTouchStart (e) {
      console.log('TouchStart执行一次')
      this.touchStatus = true
    },
    handleSelfClick (e) {
      console.log('ontouchstart' in document)//打印是否支持touch事件。
      if ('ontouchstart' in document) {
        this.handleTouchStart(e)
      } else {
        this.handleleterClick(e)
      }
    }
  }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • 生成Android App签名(为APK签名)

    生成Android App签名(为APK签名)

    2021年8月19日
  • S3C2440 体系结构图

    S3C2440 体系结构图ARM bank:ArmState寄存器:ThumbState寄存器:CPRS寄存器:模式控制M0-M4:PC值计算:大小端:中断向量:

    2022年4月30日
  • mac在变化mysql-rootpassword-各种解决问题的能力

    mac在变化mysql-rootpassword-各种解决问题的能力

    2022年1月15日
  • 链表排序之选择排序法_单链表直接选择排序

    链表排序之选择排序法_单链表直接选择排序选择排序的优点在于它每次选择出最大或者最小的值,将它们进行排序此选择排序的思想在于选择出最小的节点,创建新链表,将原链表的最小节点删除,继续循环TYPE*lain(intl,TYPE*head){TYPE*first,*tail,*p_min,*min,*p;first=NULL;while(head!=NULL){

    2022年10月11日
  • 面试题整理|45个CSS面试题

    面试题整理|45个CSS面试题面试题整理|45个CSS面试题一、初级CSS面试题二、中级CSS面试题三、进阶CSS面试题四《HTML5&CSS3还原美团外卖》移动端布局实战CSS已成为Web设计不可或缺的一部分,它让web页面变得更加美观,更具设计感。在前端面试中,CSS面试题也占有一定比重。本篇文章,将为大家分享45个和CSS相关的面试题及其解析,难度分为:初级、中级、高级三个部分,由易到难,循序渐进。一、初级CSS面试题Q1、CSS全称是什么?CSS英文全称:CascadingStyleSheets,也就是层

    2022年5月31日
  • 学生信息管理系统(纯前端页面)———无后端数据库

    学生信息管理系统(纯前端页面)———无后端数据库无后端数据库版本的—-学生信息管理系统文末下载地址这学期的前端作业很奇怪,不用数据库实现学生信息管理系统,随便写了下。具体功能如下:实现了查看信息(单击查看按钮,查看具体信息,且为不可修改格式) 实现了修改信息功能(单击修改按钮,可以对学生的信息进行修改) 实现了新增功能(可以新增加一个学生的信息,添加到最后边) 实现了删除功能(在复选框中选择几个就删除几个) 实现了全…

    2022年9月20日

发表回复

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

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