pc端拖拽时mouseup事件丢失

前端开发者在实现PC端元素拖拽时遇到mouseup事件丢失的问题,尝试通过阻止默认行为、设置图片不可拖拽及防止文本选中等方式解决。经过多次尝试,最终找到阻止浏览器默认事件的方法,确保拖拽功能正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为一个不停撞墙成长的小小前端码农,“尝试”着去解决问题,当解决问题后那种释然让我可以有更多的兴趣,不断成长,更加的坚持不懈。

在实现pc端拖拽左右移动元素时,使用mousedown+mousemove+mouseup实现左右拖拽移动,操作多次是总会出现不进入mouseup事件,导致无法清除mousemove事件。

1.第一次尝试

由于我要拖拽的元素中有图片,于是猜测是否浏览器默认行为变成拖拽图片,于是给图片添加不允许拖拽的属性:

<img src="xxx" draggable="false" />

加入后发现确实一定程度上减少了拖拽图片的发生,但仍然会出现不进入mouseup

第二次尝试

猜测:不进入mouseup事件或许在mousemove事件后进入了别的什么事件。例如取消事件。
经过查询鼠标事件发现可以尝试用mouseleave事件来清除mousemove。于是多加了个监听mouseleave事件来清除mousemove。

第三次尝试

猜测:加入mouseleave后确实比较少出现不清除mousemove事件了,但还是不理想。还是回到一开始的猜测,浏览器似乎在进行拖拽元素,像是拖拽里面的文字或图片,百思不得其解。最后多方搜查告诉了我答案:
众所周知,浏览器鼠标事件有默认行为,例如事件冒泡等其他行为。我们只需在mousedown以及mousemove事件中把这些默认行为禁止掉即可。
以下是停止默认行为代码(兼容写法):

e = e || window.event;
//这两个IE9以下不支持
if(e.stopPropagation) {
e.stopPropagation();
}
if(e.preventDefault) {
e.preventDefault();
}
//下面两个谷歌在新版本已经支持,火狐不支持
e.cancelBubble = true;
e.returnValue = false

更新

之前的第一次尝试猜测只解决了图片的拖拽,后面也在事件中停止默认行为代码,附加一条需要在监听元素上加上css:user-select: none;防止其text选中移动影响mouseup事件。

插播情感

闲暇时总觉得自己是否适合这份工作,遇到难题时总怀疑自我,为什么那么笨,别人应该一下子就解决了吧。
或者这个难题感觉应该很简单,但我却要花上大半天的时间才能解决问题,解决问题后很开心,下班回家的途中我又在想,这么慢,被别人发现这么简单的问题解答了那么久谁也不会想招聘你。
或者是自己去学习一些自己的短板时候,一整天学习下来发现自己根本搞不懂。
但是我总是想去“尝试”着去学习尽量多的知识,解决更多的我没做过的东西,我喜欢那种解答问题后释然的心情,也喜欢经过几个月的删删改改完善后“我”完成的项目…
勉励自己,成长的脚步虽慢,但起码心还是笃定的,知道方向在哪里,我不是已经幸运很多。
记录下来说不定以后就忘记了呢~(我可真是个小机灵鬼)

出现这种情况的主要原因可能是鼠标拖动过程中出现了一些突然的动作或意外的操作,导致 mouseup 事件没有被正常触发。 一种可能的情况是在鼠标拖动的过程中,如果用户快速拖动鼠标、频繁改变拖动方向或者在拖动过程中按下了其他键,可能会导致 mouseup 事件丢失。这是因为鼠标在这些情况下无法保持持续的按压,从而无法正确触发 mouseup 事件。 另一种情况是在鼠标拖动的过程中,如果鼠标移出了可视区域(即窗口或浏览器的可视区域),也会导致 mouseup 事件丢失。因为当鼠标移出可视区域后,浏览器无法监听到对应的事件并触发相应的操作。 为了解决这个问题,我们可以采取一些措施来确保 mouseup 事件能够正常触发。例如,可以在拖动过程中增加一些判断条件,当用户频繁改变鼠标方向或按下其他键,及终止拖动并触发 mouseup 事件。同,可以增加一个事件监听器,当鼠标移出可视区域,及拖动状态重置并触发 mouseup 事件。 另外,在实现拖动功能,可以考虑使用一些成熟的第三方插件或框架,这些插件或框架通常会处理好各种鼠标事件的触发和监听,提高了拖动的稳定性和可靠性。 总而言之,解决鼠标拖动过程中 mouseup 事件丢失的问题,需要将可能导致事件丢失的情况纳入考虑,并采取相应的措施进行处理,以确保拖动功能的正常使用。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值