2012-03-03 15 views
73

मैंने मोबाइल वेब अनुप्रयोगों में उपयोग के लिए कस्टम jQuery ईवेंट की एक श्रृंखला बनाई है। वे महान काम करते हैं और परीक्षण किया गया है। हालांकि, मैंने एक छोटी सी समस्या में भाग लिया है जिसे मुझे समझ में परेशानी हो रही है।jQuery क्लोन() ईवेंट बाइंडिंग क्लोनिंग नहीं, यहां तक ​​कि()

मैं डीओएम के भीतर कुछ तत्वों पर .clone() का उपयोग कर रहा हूं, जिसमें एक बटन होता है। बटन में कुछ कस्टम इवेंट्स हैं (घटनाएं .on() का उपयोग करके बाध्य हैं), लेकिन। दुर्भाग्यवश, जब मैं jQuery के .clone() का उपयोग करता हूं, तो बाइंडिंग संरक्षित नहीं होती है, और मुझे उन्हें फिर से जोड़ना होगा।

क्या किसी ने इससे पहले सामना किया है, क्या किसी को किसी संभावित काम के बारे में पता है? मैंने सोचा कि .on() का उपयोग अब मौजूद तत्वों के लिए बाध्यकारी को संरक्षित करना था, या भविष्य में?

+0

"मैंने सोचा था कि .on का उपयोग कर() तत्व है कि अब मौजूद हैं, या भविष्य में के लिए बाध्यकारी बनाए रखने के लिए चाहिए था?" -'clone' के साथ इसका कोई संबंध नहीं है; यह jQuery का ईवेंट प्रतिनिधिमंडल तर्क है और यदि आप '.on' के लिए अतिरिक्त चयनकर्ता पास करते हैं तो काम करता है। – pimvdb

उत्तर

166

मुझे लगता है कि आप .clone() विधि के इस अधिभार का उपयोग करना चाहिए:

$element.clone(true, true); 

क्लोन ([withDataAndEvents] [, deepWithDataAndEvents])

withDataAndEvents: एक बूलियन कि क्या घटना का संकेत हैंडलर और डेटा तत्वों के साथ कॉपी किया जाना चाहिए। मूल मूल्य गलत है।

deepWithDataAndEvents: एक बूलियन इंगित करता है कि क्लोन तत्व के सभी बच्चों के लिए ईवेंट हैंडलर और डेटा की प्रतिलिपि बनाई जानी चाहिए। डिफ़ॉल्ट रूप से इसका मान पहले तर्क के मान से मेल खाता है (जो गलत पर डिफ़ॉल्ट होता है)।


खबरदार कि .on() वास्तव में लक्ष्य के लिए, लेकिन तत्व आप के लिए सौंपने कर रहे हैं करने के लिए घटनाओं के लिए बाध्य नहीं है। तो अगर आप हैं:

$('#container').on('click', '.button', ...); 

घटनाओं वास्तव में #container से आबद्ध कर रहे हैं। जब .button तत्व पर क्लिक होता है, तो यह #container तत्व तक बुलबुला होता है तत्व को ट्रिगर करने वाला तत्व .on() के चयनकर्ता पैरामीटर पर मूल्यांकन किया जाता है और यदि यह मेल खाता है, तो ईवेंट हैंडलर निष्पादित किया जाता है। इस तरह घटना प्रतिनिधिमंडल काम करता है।

यदि आप तत्व # कंटेनर क्लोन करते हैं, तो आपको संरक्षित होने के लिए .on() के साथ किए गए बाइंडिंग के लिए ईवेंट और डेटा के साथ गहरा क्लोन करना होगा।

यदि आप #container के माता-पिता पर .on() का उपयोग कर रहे थे तो यह आवश्यक नहीं होगा।

+11

कभी भी 'clone() 'स्वीकार किए गए तर्कों को नहीं जानता था। एफएमएल। आपकी सहायता के लिए धन्यवाद. – BenM

+0

खुशी हुई यह मदद की! –

+1

@DidierGhys धन्यवाद, मैं '.data()' (डेटा 'xxxx = "somedata" और डीओएम में डेटा) क्लोनिंग नहीं कर रहा '.clone()' के साथ संघर्ष कर रहा हूं .. यह भी इसे ठीक करता है! –

4

आपको इस तथ्य से अवगत होना चाहिए कि गहरी क्लोनिंग कार्यक्षमता 1.5 jQuery संस्करण में जोड़ा गया था। इस विषय पर

और जानकारी:

http://api.jquery.com/clone/

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