2012-04-23 14 views
27

उदाहरण के लिए, मान लीजिए कि मैंjQuery: क्या एक ईवेंट श्रोता एक ही ईवेंट के पिछले श्रोता को ओवरराइट करता है?

$(element).on('click', function() {/*Some Stuff*/}); 

कहीं परिभाषित किया गया है, तो बाद में मुझे लगता है कि एक ही क्लिक करें घटना लिए अधिक विशेषताएं शामिल करना चाहते हैं। अगर मैं

$(element).on('click', function() {/*Other Stuff*/}); 

"अन्य सामग्री" "कुछ सामग्री" को ओवरराइट करेगा?

+0

यहाँ http://stackoverflow.com/questions/891989/javascript-adding-an-onclick-handler-without-overwriting-the-existing-one –

+1

क्यों downvotes एक बार देख ले? सवाल स्पष्ट और संक्षेप में है। –

+0

लॉल, मैं यह जानकर कोड को अंधाधुंध रूप से लिखना नहीं चाहता था कि यह मामला है या नहीं। मैंने और अधिक समझने के लिए अपना प्रश्न संपादित किया। – trusktr

उत्तर

20

दूसरा श्रोता पहले ओवरराइड नहीं करेगा। jQuery इवेंट हैंडलर को संचयी रूप से जोड़ा जाता है और वे संलग्न किए गए क्रम में निष्पादित होते हैं।

बात यह है कि प्रभाव है कि क्या एक हैंडलर रोकता अन्य चल कैसे समारोह ब्राउज़र की डिफ़ॉल्ट क्लिक हैंडलर रद्द है करता है (यानी कैसे आपको लिंक के यूआरएल निम्नलिखित ब्राउज़र बंद)

आप पारंपरिक विधि का उपयोग करते हैं:

$(element).on('click', function() { 

    /* Some Stuff, do your thing */ 

    return false; 
}); 

उपरोक्त हैंडलर ईवेंट को रोक देगा और अन्य हैंडलरों को प्रचारित करेगा।

लेकिन आप अपने प्रचार या हैंडलर को रोके बिना घटना कार्रवाई को रोकने के कर सकते हैं:

$(element).on('click', function(e) { 

    // prevent the default action at first, just to make it clear :) 
    e.preventDefault(); 

    /* do your thing */ 

    return /* what you want */; 
}); 

यह सुनिश्चित होगा कि डिफ़ॉल्ट क्लिक कार्रवाई नहीं होती है लेकिन घटना अन्य hanlders करने के लिए जारी है। jQuery ईवेंट में कुछ अन्य उपयोगी event propagation methods (उदा। Event.stopPropagation()) हैं जो जानने के लायक हैं।

+1

ओह! इससे स्पष्ट हुआ। मैंने हमेशा सोचा कि क्यों .preventDefault() का उपयोग परेशान है ... अब मुझे पता है। – trusktr

+0

क्या होगा यदि आप दो बार एक ही कॉलबैक जोड़ रहे हैं? उदाहरण के लिए: 'jQuery (विंडो) .on ("स्क्रॉल, MyClass.scroll") '। क्या इसके लिए कोई परीक्षण है? (मुझे लगता है कि मैं देख सकता था। Sigh।) –

11

नहीं, घटनाओं को ओवरराइट नहीं किया गया है, वे ईवेंट हैंडलरों की सूची में शामिल या धक्का दिए गए हैं।

यह observer pattern का एक सामान्य उपयोग है।

या http://api.jquery.com/die/ के साथ .live के मामले में ईवेंट को हटाया जा सकता है।

+0

ओह, मीठा! हाहा – trusktr

1

आपने गलत समझा है; एक और हैंडलर जोड़ना पहले ओवरराइट नहीं करता है।

इस jsFiddle देखें: लिंक पर http://jsfiddle.net/ymuBs/

क्लिक करना कंसोल के लिए "एक" लिखता है। बटन पर क्लिक करने से लिंक पर एक और हैंडलर जोड़ता है। अब लिंक पर क्लिक करने से कंसोल में "एक" और "दो" लिखा जाता है:

4

नहीं, यह नहीं होगा। on() बस बाइंड की तरह है - यह घटना को $.data("events")

जोड़ता है हालांकि आप off() के माध्यम से सामग्री को स्पष्ट रूप से हटा सकते हैं।

0

यह पहले से ही उत्तर दिया गया है, लेकिन मैंने सोचा कि मैं जोड़ता हूं कि मैं आमतौर पर इस समस्या को कैसे संबोधित करता हूं जब मैं ऐसी परिस्थिति में हूं जहां मेरे पास एक क्लिक श्रोता डुप्लीकेट हो सकता है।

मैं सिर्फ उपयोगकर्ता क्वेरी और पर तरीकों बंद ...

$ (तत्व)।बंद ('पर क्लिक करें'); // पूर्व में जोड़ी गई क्लिक श्रोता पद्धति पर

$ (तत्व) .on का उपयोग कर ('क्लिक', function() {/ कुछ सामग्री /}) निकालता है; // इसे वापस आ जाता है और केवल एक बार

http://api.jquery.com/off/

.off() विधि ईवेंट हैंडलर्स कि .on साथ जुड़े थे निकाल देता है चलाता है()। अधिक जानकारी के लिए उस पृष्ठ पर प्रतिनिधि और सीधे बाध्य घटनाओं की चर्चा देखें। किसी भी तर्क के साथ कॉलिंग .off() तत्वों से जुड़े सभी हैंडलर को हटा देता है। इवेंट नाम, नामस्थान, चयनकर्ता, या हैंडलर फ़ंक्शन नामों के संयोजन प्रदान करके तत्वों पर विशिष्ट ईवेंट हैंडलर को हटाया जा सकता है। जब एकाधिक फ़िल्टरिंग तर्क दिए जाते हैं, तो प्रदान किए गए सभी तर्क ईवेंट हैंडलर को निकालने के लिए मेल खाते हैं।

+0

यह वास्तव में सवाल का जवाब नहीं देता है। यह सिर्फ एक सुझाव तकनीक देता है। सवाल पहले ही स्पष्ट रूप से उत्तर दिया गया था। इस प्रश्न गेम में आप आम तौर पर किसी नए तरीके से प्रश्न का उत्तर देते हैं या कॉल करते हैं कि आप अतिरिक्त जानकारी प्रदान कर रहे हैं जो पहले से ही प्रदान नहीं किया गया था, अगर आप अपवॉट चाहते हैं। – joshp

+0

अच्छा पॉइंट जोश, मैं किसी भी रैंकिंग की तलाश नहीं कर रहा था। मैं बस इस मुद्दे पर शोध कर रहा था क्योंकि मैंने इस मुद्दे पर शोध किया था और सोचा था कि अन्य लोग भी जानना चाहेंगे ... –

+0

समझा। मैंने केवल एक टिप्पणी पोस्ट की है क्योंकि आप साइट पर नए लगते हैं। – joshp

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