2009-10-13 11 views
19

को रोकता है यदि मुझे गतिशील रूप से एक क्लिक फ़ंक्शन असाइन करने की आवश्यकता है, तो यह सुनिश्चित करने का एक तरीका है कि क्लिक फ़ंक्शन केवल एक बार असाइन किया गया हो और डुप्लिकेट नहीं किया गया हो? ,jquery डुप्लिकेट फ़ंक्शन को

//assuming this is a jquery object. 
this.unbind("click"); 
this.click(function(){ 
    alert("clicked once"); 
}); 

jQuery 1.7 के रूप में अब क्लिक .on का उपयोग करता है (http://api.jquery.com/click/:

this.click(function(){ 
    alert('test'); 
}) 

उत्तर

34

आप क्लिक करें घटना से पहले आप इसे फिर से बाँध कि जिस तरह से आप केवल एक घटना इसे से जुड़े होगा निकल सकते हैं,) तो सही कोड है

//assuming this is a jquery object. 
this.off("click"); 
this.click(function(){ 
    alert("clicked once"); 
}); 

यह सभी क्लिक ईवेंट (किसी भी plugins आप उपयोग कर रहे हैं) के द्वारा बनाई गई सहित निकल जाएंगे। यह सुनिश्चित करने के लिए कि आप केवल अपने ईवेंट उपयोग नामस्थान को अनइंड करें। (http://api.jquery.com/off/)

//assuming this is a jquery object. 
this.off("click.myApp"); 
this.on("click.myApp", function(){ 
    alert("clicked once"); 
}); 

यहां मेरा ऐप नामस्थान है।

+0

बिल्कुल सही, मैं वही चाहता हूं जो मैं चाहता हूं । धन्यवाद! – Roger

9

मैं मेरियस के answer--

से बचने में डुप्लिकेट बाइंडिंग अगर आप गलती से कुछ निकल करने के लिए अगर वहाँ एक से अधिक कार्य एक घटना के लिए बाध्य माना जाता है नहीं करना चाहती में जोड़ने के लिए चाहते हैं। यह विशेष रूप से महत्वपूर्ण है जब आप एकाधिक डेवलपर्स के साथ कुछ पर काम कर रहे हैं। इसे रोकने के लिए आप घटना नेमस्पेसिंग उपयोग कर सकते हैं:

//assuming this is a jquery object. 
var alertEvent = 'click.alert' 
this.unbind(alertEvent).bind(alertEvent,function(){ 
    alert('clicked once'); 
}); 

यहाँ 'अलर्ट' आपके क्लिक करें घटना और केवल अपने कार्यों कि कि नाम स्थान से बंधे थे अबाध हो जाएगा के लिए नाम स्थान का नाम है।

15
jQuery के साथ

.on() आप ऐसा ही कुछ कर सकते हैं:

//removes all binding to click for the namespace "myNamespace" 
$(document).off('click.myNamespace'); 

$(document).on('click.myNamespace', '.selector', function(event) {...}); 

//this will be also removed (same namespace) 
$(document).on('click.myNamespace', '.anotherSelector', function(event) {...}); 
+1

इस उत्तर के लिए धन्यवाद, sieppl। बस jQuery दस्तावेज़ीकरण की जांच की और यह कहता है: 'jQuery 1.7 के रूप में, .on() विधि किसी दस्तावेज़ में ईवेंट हैंडलर को जोड़ने के लिए पसंदीदा तरीका है। पिछले संस्करणों के लिए, .bind() विधि का उपयोग इवेंट हैंडलर को सीधे तत्वों को जोड़ने के लिए किया जाता है। हैंडलर jQuery ऑब्जेक्ट में वर्तमान में चयनित तत्वों से जुड़े हुए हैं, इसलिए उन तत्वों को उस बिंदु पर मौजूद होना चाहिए जिस पर कॉल .bind() होता है। अधिक लचीली घटना बाध्यकारी के लिए, .on() या .delegate() में ईवेंट प्रतिनिधिमंडल की चर्चा देखें। ' मेरा निष्कर्ष: अधिकांश मामलों के लिए यह .bind() –

+0

@esco_ से बेहतर है: हाँ, मैंने चालू किया () पूरी तरह। मैंने कभी भी बाइंड() का उपयोग नहीं किया, लेकिन लाइव() और प्रतिनिधि() का उपयोग करना बंद कर दिया। – sieppl

0

यह सोचते हैं कि तत्वों एचटीएमएल जोड़े जा रहे हैं और आप एक घटना तत्व जोड़े के लिए ही जोड़ना चाहते हैं:

function addEvents2Elements()//prevent Duplicate 
{ 
    //this will add the event to all elements of class="ele2addevent" 
    $('.ele2addevent').not('.clickbind').on('click',function(){alert('once');}) 

    //this will add a class an then the class="ele2addevent clickbind" 
    $('.ele2addevent').not('.clickbind').addClass('.clickbind'); 
    //all elements of class="... clickbind" will not be catched anymore in the first line because of .not() every time you call this function 
} 
addEvents2Elements(); 

हो यह सुनिश्चित करें कि आप केवल वर्ग = "ele2addevent" के साथ जोड़ते हैं, क्योंकि बाध्य होने के बाद यह वर्ग = "ele2addevent clickbind" होगा और फिर कैच नहीं किया जाएगा ...

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