Momentan arbeite ich an einem Szenario, das ich brauche, um die Daten zu ändern, die einem ziehenden Element angehängt werden, nachdem das Ziehen begonnen hat. Grundsätzlich sind die Drop-Zones Eingabefelder oder Textfelder, also würde ich gerne das native event.dataTransfer.setData
verwenden, da der native Drag-Drop den Caret mit der Maus bewegen kann.Event.dataTransfer kann asynchron nach Drag-Start gesetzt werden?
Alles funktioniert perfekt am Anfang, wenn ich nur setData()
synchron im Listener von dragstart
Ereignis aufrufen.
dragItem.addEventListener("dragstart",function(event){
event.dataTransfer.setData("text/plain","data set in dragstart");
})
Allerdings könnte mein Szenario sein, dass die Daten von einer asynchronouly Callback-Funktion ist wie eine AJAX-Anforderung. Dann versuchte ich setData()
in dieser Rückruffunktion aufzurufen, aber nichts scheint erfolgreich eingestellt zu sein.
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)
})
Ich habe auch versucht, die Daten in dragenter
und sogar drop
Ereignis-Listener des Drop-Zones zu ändern. Aber es gab immer noch kein Glück.
Diese plunker zeigt, was ich versucht habe.
Dann habe ich auf die MDN API document verwiesen, um offizielle api Beschreibung des dataTransfer
Objekts zu finden. Aber es gibt nichts über Probleme wie asynchrone Verwendung von nach Drag-Start. Eine wirklich seltsame Sache ist, dass, wenn ich versuche, die beiden dataTransfer
Referenzen in dragstart
und drop
Ereignis zu vergleichen, die sind nicht das gleiche Objekt. Jetzt habe ich keine Ahnung, was tatsächlich passiert.
So sind meine Fragen
- Ist es möglich, die Daten in
dataTransfer
einstellen, nachdem das Ziehen mit dem nativen APIs gestartet (ohneevent.preventDefault
zu verwenden)? - Wenn die erste Frage die Antwort NEIN ist, welche Art von Workaround könnte ich versuchen? Ich könnte mir etwas überlegen, wie ich die Daten speichern und die Daten übertragen kann. Mein Hauptanliegen ist, dass, wenn
event.preventDefault()
aufdrop
verwendet wird, es nicht einfach ist, das Caret mit der Maus zu bewegen, wie das native Ablegen tut.
für Konsolen-GO Was ist Zweck 'event.dataTransfer' asynchron der Einstellung? Was versuchst du zu erreichen? – guest271314