vueDraggable插件拖拽过程中节点文本不允许选中方案
如上图,在拖拽“睡眠”节点过程中划过了“下载代码”其他节点,发现其他节点的文本被选中变色,会影响拖拽体验,针对这个问题有以下解决方案:
方案一:
通过onStart在拖拽开始时给body添加一个class类,然后通过这个类设置全局的指针事件,并在onEnd拖拽结束时清除这个class类。
<script setup>
// 在拖拽开始/结束时添加 body 样式控制
const onDragStart = () => {
document.body.classList.add('drag-active');
}
const onDragEnd = () => {
document.body.classList.remove('drag-active');
}
</script>
<style>
// 增强拖拽时的全局控制
body.drag-active {
cursor: grabbing !important;
* {
cursor: grabbing !important;
pointer-events: none;
&.ghost,
&.drag {
pointer-events: auto;
}
}
}
</style>
但是这个方式可能会影响页面其他容器的效果。
方案二:
通过物理屏蔽+定时清理,确保拖拽过程中无法选中文本,也不影响拖拽元素操作,可以根据实际效果调整清理间隔时间(50ms)。
// 在拖拽开始时添加终极保护
const onDragStart = () => {
// 添加事件防护
const cleanSelection = () => {
window.getSelection().removeAllRanges()
document.onselectstart = () => false
}
// 高频清理选区
const selectionCleaner = setInterval(cleanSelection, 50)
// 拖拽结束时清理
const onEnd = () => {
document.onselectstart = null
clearInterval(selectionCleaner)
document.removeEventListener('mouseup', onEnd)
}
document.addEventListener('mouseup', onEnd, { once: true })
}