目前我正在处理一个场景,我需要在拖动开始后更改附加到拖动元素的数据。基本上拖放区域是输入字段或textareas,所以我想使用本机event.dataTransfer.setData
,因为本地拖放可以使光标随鼠标移动。可以在拖动开始后异步设置event.dataTransfer吗?
如果我只是在dragstart
事件的侦听器中同步调用setData()
,那么一开始就可以完美工作。
dragItem.addEventListener("dragstart",function(event){
event.dataTransfer.setData("text/plain","data set in dragstart");
})
但是,我的情况可能是数据来自异步回调函数,如AJAX请求。然后我试图在这个回调函数中调用setData()
,但似乎没有成功设置。
dragItem.addEventListener("dragstart",function(event){
event.dataTransfer.setData("text/plain","data set in dragstart");
//like a callback in Ajax or resolve function of a promise.
setTimeout(function(){
console.log("attempt to set data asynchonrously after drag start");
event.dataTransfer.setData("text/plain","asynchonrously set data");
//looks like failed, the console output is empty, even not the original set one
console.log(event.dataTransfer.getData("text/plain"));
},200)
})
我也试图改变dragenter
数据和放置区域甚至drop
事件侦听器。但仍然没有运气。
这plunker显示我试过。
然后我参考MDN API document找到dataTransfer
对象的官方api描述。但是没有任何关于在拖动开始后异步使用setData
的问题。一个非常奇怪的事情是,如果我尝试比较dragstart
和drop
事件中的两个dataTransfer
引用,则不是同一个对象。现在我不知道实际发生了什么。
所以我的问题是
- 是否可以拖动启动后与本机API(不使用
event.preventDefault
)来设置数据dataTransfer
? - 如果第一个问题的答案是NO,我可以尝试什么样的解决方法? 我可以想到如何保存和获取数据进行传输。我主要关心的是,如果在
drop
上使用event.preventDefault()
,那么使用鼠标就像本地丢弃一样获得脱字符号并不容易。
什么是设置'event.dataTransfer'异步的目的是什么?你想达到什么目的? – guest271314