Überblick
Ich habe die folgende HTML-Struktur und habe die dragenterund 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 dragenterEreignis wie erwartet ausgelöst. Wenn ich jedoch mit der Maus über ein untergeordnetes Element bewege, z. B. <div id="drag-n-drop">, wird das dragenterEreignis für das <div id="drag-n-drop">Element und dann das dragleaveEreignis für das <div id="dropzone">Element ausgelöst .
Wenn ich den Mauszeiger erneut über das <div id="dropzone">Element bewege, wird das dragenterEreignis erneut ausgelöst, was cool ist, aber dann wird das dragleaveEreignis für das gerade verbleibende untergeordnete Element ausgelöst, sodass die removeClassAnweisung ausgeführt wird, die nicht cool ist.
Dieses Verhalten ist aus zwei Gründen problematisch:
Ich hänge nur
dragenter& andragleavean 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 nichtdragleaveschieß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 dragleavenicht 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 dragleaveEreignis 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();