2012-04-24 19 views
5

पर निकाल दिया गया है, मैंने किसी ऑब्जेक्ट पर dragenter ईवेंट बाध्य किया है जिसमें कुछ बच्चे हैं।jQuery ड्रैगेंटर ईवेंट प्रत्येक बच्चे

$(document).on('dragenter', '#container', function(e) { 
    console.log('dragenter'); 
}); 

जब मैं उनके चारों ओर खींची गई फ़ाइल के साथ चलता हूं, तो यह घटना बार-बार गोलीबारी कर रही है। मैंने जो उम्मीद की है वह dragenter को केवल #container तत्व दर्ज करते समय, हर बच्चे को भी फायरिंग नहीं कर रहा है।

क्या यह उचित व्यवहार है? मैं यह कैसे रोक सकता हूँ?

उत्तर

12

परीक्षण कर सकते हैं कि क्या तत्व तो ईवेंट को ट्रिगर कंटेनर है:

:

var container = $('#container').get(0); 

$(document).on('dragenter', '#container', function(event) { 
    if(event.target === container) { 
     console.log('dragenter'); 
    } 
}); 

या आप घटना प्रतिनिधिमंडल उपयोग करने के लिए नहीं है, तो

$('#container').on('dragenter', function(event) { 
    if(event.target === this) { 
     console.log('dragenter'); 
    } 
}); 
+1

दुर्भाग्यवश यदि '# कंटेनर' पूरी तरह से अपने बच्चों के साथ कवर किया गया है तो यह परीक्षण हमेशा विफल रहता है। क्या बच्चों को 'ड्रैगेंड' से बांधना संभव नहीं है - बस '# कंटेनर'? – hsz

+0

ठीक है, मैंने आपके उत्तर का उपयोग करके इसे छुटकारा दिलाया। हालांकि मैं सिर्फ एक घटना के साथ माता-पिता को बाध्य करने के बारे में उत्सुक हूं। ;-) धन्यवाद! – hsz

+0

आपकी समस्या https://bugs.webkit.org/show_bug.cgi?id=66547 से संबंधित हो सकती है –

0

कोशिश stopPropagation जोड़ने के लिए

$(document).on('dragenter', '#container', function(e) { 
    e.stopPropagation(); 
    console.log('dragenter'); 
}); 
+0

$ (दस्तावेज़) –

+0

के बजाय चयनकर्ता के रूप में $ ('# कंटेनर') का उपयोग करें मुझे इसे इस तरह से करना है क्योंकि मुझे 'on' के लाइव व्यवहार की आवश्यकता है। – hsz

+0

प्रलेखन बताता है कि घटना '#container' से चयनकर्ता $ (दस्तावेज़) तक बुलबुले हो जाती है। आपके मामले में अपेक्षित व्यवहार वास्तविक से अलग है और आपको स्वयं को फ़िल्टर करने की आवश्यकता है (जहां तक ​​मैं देख सकता हूं) (फ़ेलिक्स का उत्तर देखें) –

0

इस प्रश्न का मेरा उत्तर event capturing का उपयोग करने के बजाय ent bubbling।

संक्षेप में, बाहरी तत्व से, स्रोत तत्व पर या e.stopPropagation() तक ईवेंट कैप्चरिंग "ट्रिकल्स डाउन" कहा जाता है।

घटना बुलबुले बुलबुले स्रोत तत्व से तब तक माता-पिता के माध्यम से घटनाओं तक पहुंचते हैं जब तक यह दस्तावेज़ तक नहीं पहुंचता है या e.stopPropagation() के साथ बंद कर दिया जाता है।

तो, ड्रैग एंटर पर लागू करने के लिए, आप बाहरी div को घटना को संभालने के लिए चाहते हैं, भले ही यह वास्तव में आंतरिक div है जो घटना उत्पन्न कर रहा हो।

घटना कैप्चरिंग का उपयोग बाहरी div से पहले बाहरी div में ऑनडैगेंटर आग बनाते हैं। बाहरी div ईवेंट हैंडलर में, आप e.stopPropagation को कॉल करते हैं। तो आंतरिक div घटना हैंडलर वास्तव में कभी नहीं चलता है।

$("#outerDiv").get(0).addEventListener("ondragenter", function(e){e.stopPropagation()}, true); 

नोट पिछले पैरामीटर:

This कैसे jQuery का उपयोग करने के घटना पर कब्जा करने की है।

संबंधित मुद्दे