2010-04-07 24 views
13

मेरे पास एक "बटन" में एक एंकर टैग <a class="next">next</a> है। कभी-कभी, अगर टैग दिखाने के लिए कुछ नया नहीं है तो इस टैग को छिपाने की जरूरत है। अगर मैं बस .hide() के साथ बटन छुपाता हूं और इसे .show() के साथ फिर से प्रदर्शित करता हूं तो सभी ठीक काम करते हैं। लेकिन मैं इसके बजाय .fadeIn() और .fadeOut() का उपयोग करना चाहता था।अनबाइंड ('क्लिक') के बाद क्लिक ईवेंट को "रिबाइंड" कैसे करें?

मेरी समस्या यह है कि यदि उपयोगकर्ता fadeOut एनीमेशन के दौरान बटन पर क्लिक करता है, तो यह उस तर्क के साथ समस्याएं पैदा कर सकता है जो मैंने शो चलाया है। मूल क्लिक फ़ंक्शन शुरू होने के बाद मुझे मिला गया समाधान बटन से क्लिक ईवेंट को अनबिंड करना था, और फिर एनीमेशन पूर्ण होने के बाद इसे फिर से बांधना था।

$('a.next').click(function() { 
    $(this).unbind('click'); 
    ... 
    // calls some functions, one of which fades out the a.next if needed 
    ... 
    $(this).bind('click'); 
} 

उपरोक्त उदाहरण का अंतिम भाग काम नहीं करता है। क्लिक इवेंट वास्तव में एंकर से फिर से बाध्य नहीं है। क्या किसी को इसे पूरा करने का सही तरीका पता है?

मैं एक आत्म-सिखाया गया jquery लड़का हूं, इसलिए कुछ उच्च स्तर की चीजें जैसे unbind() और bind() मेरे सिर पर हैं, और jquery दस्तावेज मेरे लिए समझने के लिए वास्तव में काफी आसान नहीं है।

उत्तर

15

मैं सिर्फ अगर यह पहले एनिमेट को देखने के लिए एक जांच जोड़ना होगा:

$('a.next').click(function() { 
    if (!$(this).is(":animated")) { 
     // do stuff 
    } 
}); 
+0

धन्यवाद निक, यह पूरी तरह से काम करता है। लेकिन मैं अभी भी उत्सुक हूं कि अगर कोई जानता है तो मैं क्लिक ईवेंट को "रिबाइंड" कैसे करूं। – Ben

6

जब आप क्लिक करें घटना rebind, तो आप सब कुछ खत्म शुरू कर रहे हैं। आपको उस समारोह को प्रदान करने की आवश्यकता है जिसे आप ईवेंट को संभालने का इरादा रखते हैं। "अनबिंड" कॉल करने के बाद jQuery उन्हें आपके लिए याद नहीं रखता है।

इस विशेष मामले में, यह थोड़ा और जटिल है। समस्या यह है कि जब आप उन एनिमेशन को शुरू करते हैं तो आप एक टाइमर द्वारा संचालित क्रियाओं की एक श्रृंखला को गति में स्थापित कर रहे हैं। इस प्रकार, क्लिक करें हैंडलर पर क्लिक करें हैंडलर के अंदर "क्लिक" हैंडलर को अनबाइंड और रीबंड करना वास्तव में कुछ भी मदद नहीं करेगा। सहायता (मान लीजिए कि आप is(":animated") चाल के साथ समस्या को हल नहीं करना चाहते हैं) हैंडलर को अनबिंड करना होगा और फिर अपनी एनीमेशन से "फिनिश" कॉलबैक में पुन: जुड़ना होगा।

जब आप की स्थापना की "क्लिक" पहली जगह में हैंडलर, आप समारोह की घोषणा कॉल से "पर क्लिक करें()" को अलग कर सकते हैं: फिर

var handler = function() { 
    $(this).whatever(); 
}; 
$('a.next').click(handler); 

, आप चाहते पहुंचना चाहिए अनइंड/रीबिंड करने के लिए, आप उस कॉल को "क्लिक करें" पर दोहरा सकते हैं और उसी तरह "हैंडलर" फ़ंक्शन को संदर्भित कर सकते हैं।

+0

मैं समझता हूं कि आप क्या कह रहे हैं, लेकिन मुझे नहीं पता कि इसे कोड में कैसे अनुवादित किया जाए। जो कार्य मैं करना चाहता हूं वह वही है जो क्लिक() होता था। मैं इसे कैसे कोड करूं? – Ben

+0

अच्छी तरह से "क्लिक करें" पहले स्थान पर कैसे बाध्य हो जाता है (इससे पहले कि आप "अनबिंड" कहें)? ओह रुको मैं देखता हूं - वह * क्लिक हैंडलर है। ठीक है और मैं अपना जवाब संपादित करूंगा। – Pointy

+0

मुझे लगता है कि मैं जो कह रहा हूं उसे प्राप्त करता हूं।"हैंडलर" के ऊपर आपके उदाहरण में एक फ़ंक्शन है, और मैं हालांकि जब आप फ़ंक्शन को कॉल करते हैं तो आपको उद्घाटन और समापन कोष्ठक() की आवश्यकता होती है। – Ben

2

एक सरल और कम समाधान

वस्तु के लिए एक वर्ग को जोड़ने के लिए अगर आप निकल करने के लिए यह तो rebind करने इस वर्ग को दूर करना चाहते हैं (बाँध/अनबाइंड विधि का उपयोग कर के बिना)

पूर्व;

$('#button').click(function(){ 
    if($(this).hasClass('unbinded')) return; 
    //Do somthing 
}); 

$('#toggle').click(function(){ 
    $('#button').toggleClass('unbinded'); 
}); 
संबंधित मुद्दे