首页 > 其他分享 >解决双击事件触发两次单击事件

解决双击事件触发两次单击事件

时间:2024-02-08 10:24:19浏览次数:26  
标签:console log 单击 事件 双击 clickTimeout

问题

在写前端的时候,偶然发现,当同一个标签同时绑定了 双击事件单击事件

在触发 双击事件 的时候,会先触发两次 单击事件,这显然是不符合预期的

解决办法

可以通过增加一个延时来解决这个问题

写一个按钮

这里写一个按钮来演示

<body>
    <button onclick="handleClick()" ondblclick="handleDblClick()">点击或双击我</button>
</body>
<script>
    const handleClick = () => {
        console.log('单击事件');
    };
    const handleDblClick = () => {
        console.log('双击事件')
    }
</script>

效果

双击后

查看控制台

可以看到,双击会先触发两次单击

通过延时保证单击

<body>
    <button onclick="handleClick()" ondblclick="handleDblClick()">点击或双击我</button>
</body>
<script>
    let clickTimeout = null;
    const handleClick = () => {
        if (this.clickTimeout) {
            // 如果已经设置了定时器,说明是双击事件,取消定时器
            clearTimeout(this.clickTimeout);
            this.clickTimeout = null;
            console.log('双击事件');
        } else {
            // 如果没有设置定时器,说明是单击事件,设置定时器并等待一段时间
            this.clickTimeout = setTimeout(() => {
                console.log('单击事件');
                this.clickTimeout = null;
            }, 200);
        }
    };
    const handleDblClick = () => {
        console.log('双击事件')
    }
</script>

效果

双击后

补充

如果是在vue2中使用

<template>
    <div>
        <button @click="handleClick" @dblclick="handleDblClick">点击或双击我</button>
    </div>
</template>
<script>
export default {
    methods: {
        handleClick() {
            if (this.clickTimeout) {
                // 如果已经设置了定时器,说明是双击事件,取消定时器
                clearTimeout(this.clickTimeout)
                this.clickTimeout = null
                console.log('双击事件')
            } else {
                // 如果没有设置定时器,说明是单击事件,设置定时器并等待一段时间
                this.clickTimeout = setTimeout(() => {
                    console.log('单击事件')
                    this.clickTimeout = null
                }, 200)
            }
        },
        handleDblClick() {
            console.log('双击事件')
        }
    },
    data() {
        return {
            clickTimeout: null
        }
    }
}
</script>

标签:console,log,单击,事件,双击,clickTimeout
From: https://www.cnblogs.com/guangdelw/p/18011621

相关文章

  • 使用JQuery双击修改Table中Td
    <html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><style>table{border-collapse:collapse;border-spacing:0;margin-right:auto;......
  • vue 事件修饰符
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"/><title>事件修饰符</title><!--引入Vue--><scripttype="text/javascript"src="../js/vue.js"></script><style>*{mar......
  • Qt processEvents - 解决线程中事件阻塞(如槽函数被阻塞)
    百度了一会,发现没太有文字讲这件事情,因此整理成文字记录一下。processEvents介绍长时间运行的操作可以调用processEvents()保持应用程序响应能力。voidQCoreApplication::processEvents(QEventLoop::ProcessEventsFlagsflags=QEventLoop::AllEvents)根据指定的条件为调......
  • k8s容器秒级事件监控软件-Kube-eventer
    下面是kube-eventer的github开源地址:https://github.com/AliyunContainerService/kube-eventer ---apiVersion:v1data:content:>-{"EventType":"{{.Type}}","EventNamespace":"{{.InvolvedObject.Namespace}}"......
  • JavaScript移动端的手指触摸touch事件
    目录概念touchstart触摸发生事件touchend触摸结束事件touchmove触摸移动事件touchcancel触摸取消事件自定义事件自定义轻触事件方法touchtap自定义左右划动事件方法touchswiper概念在JavaScript中,移动端基本的手指触摸touch事件有四种,分别为:touchstart:手指触摸屏幕时......
  • vue2中el-tree组件实现双击树的节点来修改节点名称
    目标在没双击之前,树的节点是文本样式。在双击之后,节点位置变成输入框形式,原节点的名称显示在输入框中,可以进行修改。修改完毕之后,当输入框失去焦点的时候,输入框消失,又变成原本的文本样式,并且显示的是修改后的节点名称。添加一个树<template><div><el-tree......
  • 事件驱动架构
    事件(event)是状态发生变化时,软件发出的通知。事件驱动架构(event-drivenarchitecture)就是通过事件进行通信的软件架构。它分成四个部分。 事件队列(eventqueue):接收事件的入口分发器(eventmediator):将不同的事件分发到不同的业务逻辑单元事件通道(eventchannel):分发器与处理......
  • C#的事件与委托
    本文是学习B站的up主:十月的寒流的学习笔记,推荐直接观看原视频:C#的委托与事件大致是怎么一回事Action和Func是强类型委托,是dotnet为我们提供好的委托Action是没有返回值的Func是有返回值的事件是一种特殊的委托委托有什么用将函数作为函数的参数进行传递声明事件并注册......
  • 浏览器事件循环
    根据网络课程记录的一些笔记,受益匪浅单线程是异步产生的原因事件循环是异步的实现方式浏览器运行会启动:浏览器进程网络进程渲染进程(一个标签页是一个渲染进程)某进程崩溃后,互不影响渲染进程渲染进程启动后,会开启一个渲染主线程,主线程负责执行html,css,js代码默认情况下,浏览......
  • Unity基于C#事件委托机制
    事件委托是一种用于实现观察者模式的设计模式,它允许对象在发生特定事件时通知其他对象。在Unity中,事件委托机制为开发者提供了一种简单而有效的方式来处理游戏中的事件和交互。一、事件委托的基本概念事件委托是一种特殊的类型,它可以持有一个或多个方法的引用。当某个事件发生时......