mousedown、click冲突

​

写项目时遇到的一个需求,这里记录一下,简单说一下功能,需要一个img图片,可拖动,可点击跳转,但是mousedown得优先级高于ckick,不多说了下面这直接上代码。

css 复制代码
<div id="avatar" style="position: absolute;top: 10%;right: 3%;z-index: 999;" @mousedown="smallDown($event)" @click="dbcl($event)">
            <img style="width: 90px;" draggable="false" src="../assets/image/客服入口.png" alt="">
    </div>

最开始是上图这么写的,但是运行后发现,不行,同时绑定没生效,于是做了下面的调整

css 复制代码
<div id="avatar" style="position: absolute;top: 10%;right: 3%;z-index: 999;" @mousedown="smallDown($event)">
        <div @click="dbcl($event)">
            <img style="width: 90px;" draggable="false" src="../assets/image/客服入口.png" alt="">
        </div>
    </div>

这里两个时间都会生效了,但是新的问题,如何区分开两个事件,百度了很多,最后还是用setTimeout,去做时间差异,如下图

javascript 复制代码
dbcl(e) {
        clearTimeout(this.down);// 清除上一个
 },
smallDown(e) {
        clearTimeout(this.down);// 清除上一个
        this.down = setTimeout(function (event) {
          
          }, 200);// 超过这个时间代表走的是拖动
      }

好了,事件的解决了,接下来就该,拖动的了,话不多说直接上代码

ini 复制代码
smallDown(e) {
        clearTimeout(this.down);
        this.down = setTimeout(function (event) {
            this.mouse = true;
          	var demo = document.getElementById('avatar');// 获取图片的demo
          	demo.style.pointerEvents = 'none';//阻止事件穿透
            var canMove = false 
            var x = 0, y = 0  
            x = e.pageX - demo.offsetLeft // 获取位置
            y = e.pageY - demo.offsetTop
            canMove = true
            var Onmousedown = document.onmousedown;
            var Onmousemove = document.onmousemove;
            document.onmousemove = function (e) {
                e.preventDefault(); //阻止默认行为
                if (canMove) {
                    var left = e.pageX - x
                    var top = e.pageY - y
                    if (left < 0) left = 0
                    if (top < 0) top = 0
                    var maxLeft = window.innerWidth - demo.offsetWidth
                    var maxTop = window.innerHeight - demo.offsetHeight
                    if (left > maxLeft) left = maxLeft
                    if (top > maxTop) top = maxTop
                    demo.style.left = left + "px" // 得到图片移动的位置坐标
                    demo.style.top = top + 'px'
                }
                document.onmouseup = function (event) {
                    event.preventDefault(); //阻止默认行为
                    demo.style.pointerEvents = null;
                    canMove = false
                    document.onmousedown = Onmousedown;
                    document.onmousemove = Onmousemove;
                }
            }
            window.oncontextmenu = function (e) {
                e.preventDefault()//阻止默认行为
            }
            window.onblur = function () {
                canMove = false 
            }
          }, 200);
      }

好了,到这里,图片拖动,点击就完成了。可能有些还不是很好,也有些粗糙,这里只是作为日常的一个问题记录。有不足之处希望多多指正。

​

相关推荐
风骏时光牛马1 分钟前
后端服务接口开发与性能优化
前端
kyriewen5 分钟前
我让 4 个 AI 互相 review 代码,最温柔的那个下手最狠
前端·程序员·ai编程
计算机魔术师17 分钟前
493家公司白砸AI钱?Apollo这组数据戳破了幻觉
前端
IT_陈寒38 分钟前
Java静态变量初始化坑得我头皮发麻
前端·人工智能·后端
柳杉1 小时前
用 Codex 完成智慧高速 3D 可视化大屏,从 18 张行业设计稿到可交互的运行监测中心
前端·ai编程·数据可视化
review445431 小时前
拿到 codex 第一步
前端·agent·vibecoding
鶴哥只手遮天1 小时前
jQuery 4.0 源码架构与工程实践-第 01 章 · 全景与工程结构:一个 20 岁库的自省
前端·javascript·jquery
徐小夕2 小时前
doc2docx方案,开源!
前端·vue.js·github
徐小夕2 小时前
JitOFD:一款面向信创与档案场景的 Web 端 OFD 编辑器
前端·vue.js·github
孟健2 小时前
Kimi K3.1 Pro 编程实测:3个月27万行代码,每年1.7万预算下如何9分钟修好顽固Bug
前端·开源·ai编程