Überblick
Ich habe die folgende HTML-Struktur und habe die dragenter
und dragleave
-Ereignisse an das <div id="dropzone">
Element angehängt .
<div id="dropzone">
<div id="dropzone-content">
<div id="drag-n-drop">
<div class="text">this is some text</div>
<div class="text">this is a container with text and images</div>
</div>
</div>
</div>
Problem
Wenn ich eine Datei über das ziehe <div id="dropzone">
, wird das dragenter
Ereignis wie erwartet ausgelöst. Wenn ich jedoch mit der Maus über ein untergeordnetes Element bewege, z. B. <div id="drag-n-drop">
, wird das dragenter
Ereignis für das <div id="drag-n-drop">
Element und dann das dragleave
Ereignis für das <div id="dropzone">
Element ausgelöst .
Wenn ich den Mauszeiger erneut über das <div id="dropzone">
Element bewege, wird das dragenter
Ereignis erneut ausgelöst, was cool ist, aber dann wird das dragleave
Ereignis für das gerade verbleibende untergeordnete Element ausgelöst, sodass die removeClass
Anweisung ausgeführt wird, die nicht cool ist.
Dieses Verhalten ist aus zwei Gründen problematisch:
Ich hänge nur
dragenter
& andragleave
an die<div id="dropzone">
so verstehe ich nicht , warum die Kinder Elemente , die diese Ereignisse angebracht , wie auch.Ich ziehe immer noch über das
<div id="dropzone">
Element, während ich über seinen Kindern schwebe, damit ich nichtdragleave
schießen will !
jsFiddle
Hier ist eine jsFiddle zum Basteln: http://jsfiddle.net/yYF3S/2/
Frage
Also ... wie kann ich es so machen, dass beim Ziehen einer Datei über das <div id="dropzone">
Element dragleave
nicht ausgelöst wird, selbst wenn ich über untergeordnete Elemente ziehe ... es sollte nur ausgelöst werden, wenn ich das <div id="dropzone">
Element verlasse . Das Schweben / Ziehen irgendwo innerhalb der Grenzen des Elements sollte das dragleave
Ereignis nicht auslösen .
Ich brauche dies, um browserübergreifend kompatibel zu sein, zumindest in den Browsern, die HTML5 Drag & Drop unterstützen, daher ist diese Antwort nicht ausreichend.
Es scheint, als hätten Google und Dropbox dies herausgefunden, aber ihr Quellcode ist minimiert / komplex, so dass ich dies aus ihrer Implementierung nicht herausfinden konnte.
e.stopPropagation();