Drop-Ereignis wird nicht in Chrom ausgelöst


91

Es scheint, dass das Drop-Ereignis nicht ausgelöst wird, wenn ich es erwarten würde.

Ich gehe davon aus, dass das Drop-Ereignis ausgelöst wird, wenn ein Element, das gezogen wird, über dem Zielelement freigegeben wird, aber dies scheint nicht der Fall zu sein.

Was missverstehe ich?

http://jsfiddle.net/LntTL/

$('.drop').on('drop dragdrop',function(){
    alert('dropped');
});
$('.drop').on('dragenter',function(){
    $(this).html('drop now').css('background','blue');
})
$('.drop').on('dragleave',function(){
    $(this).html('drop here').css('background','red');
})


Antworten:


191

Damit das Drop-Ereignis für ein div-Element auftritt, müssen Sie die Ereignisse ondragenterund abbrechen ondragover. Verwenden Sie jquery und Ihren Code ...

$('.drop').on('drop dragdrop',function(){
    alert('dropped');
});
$('.drop').on('dragenter',function(event){
    event.preventDefault();
    $(this).html('drop now').css('background','blue');
})
$('.drop').on('dragleave',function(){
    $(this).html('drop here').css('background','red');
})
$('.drop').on('dragover',function(event){
    event.preventDefault();
})

Weitere Informationen finden Sie auf der MDN-Seite .


11
Sie brauchen kein Ondragenter, nur Ondragover.
access_granted

1
Immer noch ein No-Go, zumindest wenn Sie Bilder auf das neueste Chrome ziehen.
NoBugs

2
Funktioniert immer noch nicht mit dem neuesten Chromium (Vivaldi 1.2.490.39 () (32-Bit) jsfiddle.net/f282n3pt/3
mcsdwarken

2
Bei reactjs müssen Sie dem gleichen Element den onDragOver-Handler hinzufügen.
CHAN

5
Ist HTML5 und API wirklich so schlecht?
Bartosz.baczek

45

Sie können mit nur tun , eine weg event.preventDefault()auf der dragoverVeranstaltung. Dadurch wird das dropEreignis ausgelöst.


1
das hat einen unbedeckten Randfall, müssen Sie e.preventDefault () auch auf Dragenter aufrufen, siehe meinen anderen Kommentar
zupa

4

Damit das Drop-Ereignis ausgelöst wird, müssen Sie während des Over-Ereignisses einen dropEffect zuweisen. Andernfalls wird das Ondrop-Ereignis niemals ausgelöst:

$('.drop').on('dragover',function(event){
    event.preventDefault();
    event.dataTransfer.dropEffect = 'copy';  // required to enable drop on DIV
})
// Value for dropEffect can be one of: move, copy, link or none
// The mouse icon + behavior will change accordingly.

7
Eigentlich müssen Sie tun, event.originalEvent.dataTransfer.dropEffect = "copy"weil jQuery seine eigenen verwendetevent
AymKdn

0

Dies ist keine wirkliche Antwort, aber für einige Leute wie mich, denen die Disziplin für Beständigkeit fehlt. Drop hat für mich nicht in Chrom effectAllowedgeschossen, als das nicht der Effekt war, den ich eingestellt hatte dropEffect. Bei Safari hat es jedoch bei mir funktioniert. Dies sollte wie folgt eingestellt werden:

ev.dataTransfer.effectAllowed = 'move';

Alternativ effectAllowedkann als festgelegt werden all, aber ich würde es vorziehen, die Spezifität zu behalten, wo ich kann.

für einen Fall, in dem der Drop-Effekt verschoben wird:

ev.dataTransfer.dropEffect = 'move';

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.