2012-08-23 10 views
7

मैं stopPropagation() का उपयोग कर तत्वों के बाहर क्लिक ईवेंट कैप्चर करने के साथ प्रयोग कर रहा हूं।गतिशील तत्वों पर .on() और e.stopPropagation() का उपयोग

$(".container").children().on('click',function(e){ 
    e.stopPropagation();  
}); 
$(".container").on("click",function(){ 
    alert("outside the box?");  
})​ 

Here is a jsFiddle set up to demonstrate it functioning। जब आप सफेद बॉक्स के बाहर कहीं भी क्लिक करते हैं तो एक चेतावनी आग लगनी चाहिए।

अब, मैं गतिशील रूप से बनाए गए तत्वों पर एक ही सिद्धांत लागू करने की कोशिश कर रहा हूं। जहां तक ​​मैं समझता हूं, on() jQuery में ईवेंट असाइनमेंट की विधि को स्क्रिप्ट को बदले बिना काम करने की अनुमति देनी चाहिए।

Here is a second jsFiddle जहां आपको पहले तत्व बनाने के लिए एक लिंक पर क्लिक करना होगा। एक बार ऐसा करने के बाद, सिद्धांत यह है कि एक ही स्क्रिप्ट काम करेगी, लेकिन ऐसा नहीं है। इस विधि के बारे में मुझे क्या याद आ रही है?

उत्तर

5

कम शब्द में आप यह काम करता है बनाने के लिए मौजूदा पेरेंट तत्व पर on() रखना होगा:

$('body').on('click', 'a', function(e){ 
    e.preventDefault(); 
    $('<div class="container"><div class="box"></div></div>').appendTo('body'); 
    $(this).remove(); 
}); 

$('body').on('click', '.container > *', function(e){ 
    e.stopPropagation();  
}); 

$('body').on('click', '.container', function(){ 
    alert("outside the box?");  
})​ 

कोड: http://jsfiddle.net/GsLtN/5/

खंड पर आधिकारिक वेबसाइट पर और अधिक विस्तार की जांच '.on()' के लिए 'प्रत्यक्ष और प्रतिनिधि कार्यक्रम'

+0

स्पॉट ऑन। भयानक क्यों होगा के बारे में छोटी व्याख्या। –

+0

@MildFuzz: स्पष्टीकरण के लिए मेरा उत्तर देखें। इस जवाब को नहीं देखा था, वह पहले पोस्ट सेकंड मारा होगा। वैसे भी। –

2

आपको माता-पिता को .on() बांधना होगा।

आप जो करने का प्रयास कर रहे हैं वह है - किसी ईवेंट के लिए हैंडलर को एक बाध्यकारी से बांधें, फिर जांच करें कि ईवेंट उस चयनकर्ता से मेल खाने वाले तत्व द्वारा ट्रिगर किया गया था या नहीं।

$("body").on("click", '.container',function(){ 
    alert("outside the box?");  
})​ 

अपडेट किया गया बेला here

5

जब आइटम गतिशील रूप से जोड़ा है, तो आप निकटतम माता पिता है कि निश्चित रूप से नहीं होगा करने के लिए हैंडलर देते हैं चाहिए - अपने मामले में इस body है। आप on() this way to achieve a functionality उपयोग कर सकते हैं कि delegate() पेशकश करने के लिए प्रयोग किया है:

$ (चयनकर्ता के लिए माता-पिता) .on (घटनाओं, चयनकर्ता के लिए गतिशील-बच्चों, हैंडलर);

तो अपने कोड में पुनः के बस इस होगा:

$("body").on('click', '.container', function(e){ 
    var $target = $(e.target); 
    if ($target.hasClass('container')) { 
     alert("outside the box!"); 
    } 
}); 

मैं e.target इस्तेमाल किया जो तत्व वास्तव में घटना शुरू हो रहा लगता है। इस मामले में, मैं यह जांच कर आइटम की पहचान करता हूं कि इसमें container कक्षा है या नहीं।

jsFiddle Demo

+0

अच्छा समाधान। क्या यह बाध्यकारी को हटाने की मेरी क्षमता को प्रभावित करता है? गतिशील तत्वों के लिए घटनाओं को बाध्य करते समय, मैं आम तौर पर स्मृति जल निकासी के खिलाफ सुरक्षा के लिए बाध्यकारी को हटाना पसंद करता हूं। –

+1

@MildFuzz यदि आप ईवेंट हैंडलर को हटाना चाहते हैं, तो आप '.off()' (इस मामले में निश्चित रूप से 'बॉडी' पर) का उपयोग कर सकते हैं। मैं सामान्य रूप से [नेमस्पेस] (http://docs.jquery.com/Namespaced_Events) मेरी घटनाओं को हटाने के लिए आसान बनाता हूं। इसका मतलब है कि मैं बस 'क्लिक' के बजाय 'क्लिक.मैनेनाम स्पेस' पर संलग्न हूं। लेकिन यहां चाल यह है कि आपको वास्तव में ईवेंट हैंडलर को हटाने की आवश्यकता नहीं है, क्योंकि यह गतिशील तत्व से ही बाध्य नहीं है - आपको केवल यह पता होना चाहिए कि जब आप जानते हैं कि इस प्रकार के कोई और गतिशील आइटम जोड़े नहीं जाएंगे। – kapa

+0

तो घटना स्वयं बाध्यकारी घटना स्मृति का उपभोग नहीं करता है? –

2

The demo.

जब आप बाँध एक तत्व के लिए ईवेंट हैंडलर का उपयोग .on, लक्ष्य आप domcument में मौजूद होना चाहिए करने के लिए बाध्य।

$('body').on('click', '.container > *', function(e){ 
    e.stopPropagation();  
}); 
$('body').on("click",'.container',function(){ 
    alert("outside the box?");  
})​ 
+0

क्या इसका मतलब यह है कि मैं ईवेंट बाध्यकारी को हटा नहीं सकता? मेमोरी ड्रेनेज से बचने के लिए मैं हमेशा अपनी बाइंडिंग को साफ करना चाहता हूं। –

+1

@MildFuzz आप अभी भी '.off()' के साथ अपनी बाइंडिंग को हटा सकते हैं। – kapa

1

jQuery.on() के लिए प्रलेखन के अनुसार:

घटना संचालकों केवल वर्तमान में चयनित तत्वों के लिए बाध्य कर रहे हैं; वे उस पृष्ठ पर मौजूद होना चाहिए जब आपका कोड .on() पर कॉल करता है।

आप किसी पैरेंट कंटेनर को घटना के लिए बाध्य करना होगा। शायद THIS जैसे कुछ।