अवलोकन
मेरे पास निम्न 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();