Огляд
У мене є така 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();