2012-01-18 8 views
5

मैं एक वेब एप्लिकेशन बना रहा हूं और पुष्टि करने के लिए वैसे भी अपना खुद का परीक्षण कर रहा हूं लेकिन जानना चाहता था कि किसी को बाध्य/अनइंड इत्यादि के साथ इसका अनुभव हुआ है या नहीं। उदाहरण के लिए मैं पहले मौजूदा सामग्री कंटेनर की घटनाओं और बच्चों की घटनाओं को नष्ट करना चाहता हूं , फिर डीआईवी में नई सामग्री लोड करने पर रिमोट स्क्रिप्ट के आधार पर लोड और संलग्न नई घटनाओं को संलग्न करें। मैं उलटा कर सकता हूं लेकिन सोचा कि क्या यह पहले से ही जानना अच्छा लगेगा। जब तक मैं सामग्री डीआईवी को ईवेंट स्कोप रखता हूं तब तक यह दृष्टिकोण जटिलता को कम रखने के मामले में स्केल करेगा।jquery off/unbind आदि वर्तमान चयनकर्ता और बच्चों को सभी घटनाओं को दोबारा अलग करता है?

प्रति अनुरोध मैं जो कर रहा हूं उसके पीछे उद्देश्य बता रहा हूं।

मैं एक रखरखाव AJAX वेब ऐप बनाने के लिए देख रहा हूं। कल्पना कीजिए कि आप इसमें सैकड़ों पेज/स्क्रिप्ट जोड़ सकते हैं और कैली को इसके यूआरएल के अलावा इसके बारे में कुछ भी जानने की ज़रूरत नहीं है क्योंकि आप नई चीजों का अनुरोध कर रहे हैं। यही वह है जिसके लिए मैं जा रहा हूं। मैंने आईफ्रेम ओवरले का उपयोग करके ऐसा किया है और अच्छी तरह से काम करता है लेकिन शुद्ध AJAX करने के लिए मेरी मुख्य चिंता कोड की घटनाओं और बंद संदर्भों जैसी आवश्यकता के बाद स्मृति में छोड़ दी गई है। आईफ्रेम ओवरले के संबंध में इसके फायदे हैं क्योंकि ज्यादा विचार नहीं है वहां शामिल है लेकिन प्रत्येक बार एक नया यूआरएल लोड करने के लिए धीमा है और यदि आप पृष्ठ के कुछ हिस्सों को दूसरों पर अपडेट करना चाहते हैं तो वह दृष्टिकोण अच्छी तरह से एकीकृत नहीं होता है।

तो सोचा प्रक्रिया एक पैरेंट डीआईवी रखने के लिए एक पद्धति तैयार करना है जिसे jQuery लोड विधि के माध्यम से नए HTML से इंजेक्शन दिया जाना है। लोड विधि के साथ-साथ स्क्रिप्ट को निष्पादित करने का बहुत अच्छा प्रभाव पड़ता है। इसलिए यदि मैं उस दृष्टिकोण का उपयोग करता हूं, तो मुझे ऐसा करने की एक प्रणाली बनाने की आवश्यकता है जो ब्राउज़र को फटकार न करे और घटनाओं के अजीब व्यवहार को छोड़ दें। यह एक और सवाल हो सकता है।

अद्यतन

मैं वोट ऊपर एक प्रतिनिधि की ओर से इस पॉपअप को देखने के बाद मेरे प्रश्न का उत्तर दिया। यदि आप इवेंट बबलिंग दृष्टिकोण का उपयोग कर अभिभावक स्तर पर ईवेंट संलग्न करते हैं तो यह वास्तव में एक गैर-मुद्दा है। नीचे मेरा जवाब देखें।

उत्तर

2

त्वरित उत्तर नहीं है, ऐसा नहीं है।

.off() बस .unbind() जैसा है, जिसमें यह आपके द्वारा चुने गए जो भी jquery wrapped ऑब्जेक्ट्स से चुने गए प्रकार के सभी ईवेंट हैंडलर को हटा देता है। यदि आप हैंडलर को अधिक तत्वों से हटाना चाहते हैं, तो अधिक तत्व चुनें।

टिप्पणी के लिए संपादित करें: मैं मानता हूं कि आप रिकर्सन का उल्लेख करते हैं, जिसका मतलब है कि आप 'वंश' और 'बच्चों' नहीं हैं। उस स्थिति में (जैसा कि आपकी टिप्पणी बताती है) "*" वही है जो आप खोज रहे हैं। jsFiddle

$('selector, selector *') 

कि लगता है "महंगा", यह होना चाहिए। इस तरह की योजना को ध्यान में रखते हुए लगभग निश्चित सबूत हैं कि समस्या का पुनर्विचार करने का समय है।

+0

+1 लेकिन अगर आप रिकर्सिव डिटेच के अलावा सबसे तेज़ उपाय खोजने के लिए थोड़ा और जांच कर सकते हैं तो मैं आपको उत्तर के रूप में जांचूंगा। मुझे लगता है कि "*" ऐसा करेगा लेकिन अगर मुझे इसकी आवश्यकता नहीं है तो मैं एक महंगा ट्रैवर्सल नहीं चाहता हूं। धन्यवाद। –

+0

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

+0

@ kitgui.com अच्छी तरह से, एक त्वरित उत्तर हो सकता है, लेकिन विभाजन इस से आगे पीछे होता है। यदि आप हमारे साथ समस्या के विनिर्देश साझा करते हैं तो हम एक अलग समाधान प्रदान करने में सक्षम हो सकते हैं। कोड को बनाए रखने के दौरान – Sinetheta

4

मैं बस पीछा कर रहा हूं क्योंकि यह थोड़ी देर हो गया है और मेरे पास उस समस्या का एक बहुत ही सरल समाधान है।

आप हमेशा घटना इतनी तरह दृष्टिकोण बुदबुदाती का उपयोग कर माता पिता नोड पर घटनाओं देते हैं:

$('parentSelector') 
    .on('click', 'someDescendant', function(ev) { 
    // code 
    }) 
    .on('focus', 'anotherDescendant', function(ev) { 
    // code 
    }); 

तब इन घटनाओं को हटाने काफी सीधे आगे है:

$('parentSelector').off(); 

तो जब भी आप अपने विजेट लोड , आप हमेशा इसे सुरक्षित रूप से कर सकते हैं:

$('parentSelector') 
    .off() 
    .on('click.my-widget', 'someDescendant', function(ev) { 
    // code 
    }).on('focus', 'anotherDescendant', function(ev) { 
    // code 
    }); 

रिकर्सन/चयनकर्ता यदि आप उस दृष्टिकोण का उपयोग करते हैं तो समस्या मौजूद नहीं है।

+1

आपको यह मिला। मैं अनुशंसा करता हूं कि किसी भी बाइंडिंग जो केवल किसी विशेष विजेट पर लागू होती है, उस विजेट से अधिक नहीं होनी चाहिए। उदाहरण: सभी * विगेट्स (शायद क्लिक-टू-छिपाने) से संबंधित बाइंडिंग सभी विगेट्स के कंटेनर पर दिखाई देगी, लेकिन एक विशिष्ट विजेट (शायद लाइटबॉक्स नियंत्रण) से संबंधित बाध्यकारी विजेट पर ही होगी। – Sinetheta

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