2013-10-07 25 views
28

Ich versuche, das Ziehen und Ablegen von Dateien vom Desktop in das Browserfenster zu implementieren. Ich habe jQuery verwendet, wie in dem folgenden Code drei Ereignisse in das HTML-Element zu befestigen:jQuery.on ("drop") nicht feuern

$("html").on("dragover", function() { 
    $(this).addClass('dragging'); 
}); 

$("html").on("dragleave", function() { 
    $(this).removeClass('dragging'); 
}); 

$("html").on("drop", function(event) { 
    event.preventDefault(); 
    event.stopPropagation(); 
    alert("Dropped!"); 
}); 

Die ‚dragover‘ und ‚Dragleave‘ Ereignisse funktionieren, um die gesamte Seite einen Einsatz Grenze anzuzeigen, wenn ich eine Datei per Drag über ein Entfernen, wenn ich die Datei wieder herausziehen.

Das Ereignis "drop" scheint jedoch überhaupt nicht ausgelöst zu werden, die abgelegte Datei wird einfach im Browserfenster geöffnet.

Hat jemand eine Idee, warum dieses Ereignis nicht feuert?

Btw, ich teste dies in der neuesten Version von Chrome und mit jQuery 1.10.2.

+0

doppelte Frage: http://stackoverflow.com/questions/21339924/drop -event-not-fire-in-chrome/36207613 # 36207613 – bob

+0

potenzielle antwort: http://stackoverflow.com/questions/8414154/html5-drop-event-doesnt-work-unless-dragover-is-handled – bob

Antwort

74

Sie müssen alle Ereignisse löschen

$("html").on("dragover", function(event) { 
    event.preventDefault(); 
    event.stopPropagation(); 
    $(this).addClass('dragging'); 
}); 

$("html").on("dragleave", function(event) { 
    event.preventDefault(); 
    event.stopPropagation(); 
    $(this).removeClass('dragging'); 
}); 

$("html").on("drop", function(event) { 
    event.preventDefault(); 
    event.stopPropagation(); 
    alert("Dropped!"); 
}); 
+0

Das tat es, danke. Komisch, wie mir das nie in den Sinn gekommen ist! Ich musste auch die Klasse beim "Drop" -Ereignis entfernen, da das "Dragleave" -Ereignis nicht ausgelöst wird, wenn es gelöscht wird. – TreacleWench

+14

Für alle folgenden; es ist der zusätzliche Abbruch von "Dragover", der bewirkt, dass der Tropfen dann feuert. Das Abbrechen von Dragenter und Dragleave ist nicht genug. Wie @Christian sagt, müssen Sie sie ALLE abbrechen. – Kong

+1

Kannst du bitte eine Erklärung hinzufügen, warum ich das CSS entfernen/löschen muss – aroos

8

Neben Christian-Lösung kann dies zu verkürzen:

$('#my-dropzone') 
    // crucial for the 'drop' event to fire 
    .on('dragover', false) 

    .on('drop', function (e) { 
     // do something 
     return false; 
    });