अवलोकन
मेरे पास निम्न 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 और ड्रॉपबॉक्स ने इसका पता लगा लिया है, लेकिन उनका स्रोत कोड छोटा / जटिल है इसलिए मैं उनके कार्यान्वयन से यह पता लगाने में सक्षम नहीं हूं।
e.stopPropagation();