无论出于什么原因,onPaste
事件似乎都不会在可拖动元素上触发.(已在Firefox和Chrome上选中)
有没有某种方法(黑客或不黑客)使它工作?
我一直在try :
- 添加
contenteditable="true"
,但这 destruct 了用户体验,因为我不希望用户真正编辑内容 - 添加透明/不可见的输入或contentitable元素,但这要么会 destruct paste事件,要么会拖动
- 在
onMouseDown
上设置可拖动的仅为true,在onMouseUp
上设置为false,但粘贴事件仍然失败 - 用paste将可拖动的元素包装成一个元素,用paste将元素包装成可拖动的元素,仍然失败.
下面是一个最小的例子来重现这个问题:playground.
Vue.createApp({
setup() {
const pasteEvents = Vue.ref([]);
async function onPaste(event) {
console.log(event);
pasteEvents.value.push("Paste from Element " + event.target.dataset["element"])
}
return {
pasteEvents,
onPaste
}
}
}).mount("#app");
.wrapper {
display: flex;
flex-direction: column;
gap: 16px;
.paste-area {
padding: 16px;
background: #00000011;
&:focus {
border: 2px dashed red;
}
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.4.8/vue.global.min.js"></script>
<div id="app">
<div class="wrapper">
Click on an element and press Ctrl+V
<div :draggable="true">
<div class="paste-area" data-element="A" tabindex="0" @paste="onPaste">
Element A (draggable)
</div>
</div>
<div class="paste-area" tabindex="0" data-element="B" @paste="onPaste">
Element B (no draggable)
</div>
{{ pasteEvents }}
</div>
</div>
(这是一个vueplayground ,但它不会改变任何东西)
操场上有趣的部分:
<div
draggable="true"
tabindex="0"
@paste="onPaste"
>
Element A (draggable, does not work)
</div>
<div
tabindex="0"
@paste="onPaste"
>
Element B (no draggable, works)
</div>
(对于不熟悉Vue的人来说,@paste
基本上就是addEventListener("paste", () => ...)
)
在第一个元素上按Ctrl+V
不会触发paste
功能,但在第二个元素上工作正常.
编辑:似乎对每个剪贴板事件都是一样的(复制/剪切/粘贴)