Огляд
У мене є така HTML структура, і я додав елемент dragenter
і dragleave
події до <div id="dropzone">
елемента.
<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>
Проблема
Коли я перетягую файл через <div id="dropzone">
, dragenter
подія запускається, як очікувалося. Однак, коли я переміщую мишу над дочірнім елементом, наприклад <div id="drag-n-drop">
, dragenter
подія запускається для <div id="drag-n-drop">
елемента, а потім dragleave
подія запускається для <div id="dropzone">
елемента.
Якщо я знову наведіть курсор на <div id="dropzone">
елемент, dragenter
подія знову запускається, що є класно, але потім dragleave
подія запускається для дочірнього елемента, що залишився, тому removeClass
інструкція виконується, що не є крутим.
Така поведінка є проблематичною з 2 причин:
Я тільки прикріплення
dragenter
іdragleave
до<div id="dropzone">
так що я не розумію , чому діти елементи мають ці події приєднані також.Я все ще волочуся над
<div id="dropzone">
стихією, коли нависаю над її дітьми, тому не хочуdragleave
стріляти!
jsFiddle
Ось jsFiddle для роздумування: http://jsfiddle.net/yYF3S/2/
Питання
Отже ... як я можу зробити так, що коли я перетягую файл по <div id="dropzone">
елементу, dragleave
не спрацьовує, навіть якщо перетягую будь-які дочірні елементи ... він повинен запускатися лише тоді, коли я залишаю <div id="dropzone">
елемент .. Наведення / перетягування кудись у межах елемента не повинно викликати dragleave
події.
Мені потрібно, щоб це було сумісним між браузером, принаймні у браузерах, які підтримують перетягування HTML5 перетягування, тому ця відповідь не є достатньою.
Схоже, що Google і Dropbox розібралися в цьому, але їх вихідний код є складним / складним, тому я не зміг цього зрозуміти з їхньої реалізації.
e.stopPropagation();