2010-01-24 16 views
30

मेरे पास HTML इनपुट और बटन तत्व हैं। मैं फॉर्म सबमिट करने के लिए बटन का उपयोग करता हूं, द्वितीयक विंडोज़ खोलता हूं, इत्यादि समस्या यह है कि एक क्लिक 2 (और कभी-कभी कई और) फॉर्म सबमिशन में बदल रहा है, या दो अतिरिक्त ब्राउज़र विंडो खोल रहा है। मैंने कई वेब ब्राउज़र में समस्या का पुनरुत्पादन किया है। मैंने jQuery संस्करणों को स्विच करने का प्रयास किया है और इससे कुछ भी नहीं बदला है। इस तरह की चीज होने के कारण क्या हो सकता है?jQuery: एकल बटन क्लिक करें, ईवेंट फायरिंग दो या दो बार

+1

आप शायद इसे गलत कर रहे हैं। कृपया http://www.jsbin.com पर कुछ कोड या संस्करण पोस्ट करें ताकि हम आपकी मदद कर सकें। – Kobi

+1

हां, आपको निश्चित रूप से अपना कोड पोस्ट करने की आवश्यकता है अन्यथा हमारे पास सहायता करने का कोई मौका नहीं है। –

+0

मुझे एक ही समस्या है, समाधानों में से कोई भी काम नहीं करता है क्योंकि मेरे मामले में 1 पॉप विंडो पुष्टि ("..") फ़ंक्शन द्वारा कॉल किया जाता है और उस समय एंटर दबाकर उस समय "ठीक" और 1 क्रिया होगी पृष्ठभूमि में चयनित आइटम। कोई मदद? –

उत्तर

80

क्योंकि आप क्लिक करने के लिए एक ही हैंडलर बताए जाते हैं आपकी समस्या हो रहा हो सकता है घटना कई बार। मेरा सुझाव है कि आप जांच लें कि जिस लाइन को आप हैंडलर असाइन करते हैं, उसे अनजाने में कई बार नहीं कहा जा रहा है। एक अन्य समाधान एक फोन इस तरह पहले निकल करने के लिए हो सकता है:

$("#myButton").unbind("click").click(myHandler); 

लेकिन कुछ कोड मैं सिर्फ अनुमान लगा रहा हूँ देखे बिना।

+0

लगभग 6 साल, अभी भी बहुत अच्छा काम कर रहा है। धन्यवाद! – Haring10

+0

महान सरल जवाब! – Kelvin

+0

क्यों unbind का उपयोग करें? यह सिर्फ कॉल करता है .ऑफ(): 'jQuery.fn.unbind.toSource()' देता है '(फ़ंक्शन (ए, बी) {इसे वापस करें .ऑफ (ए, नल, बी)}) " – NoBugs

12

यह देखते हुए कि आप जानकारी का एक बहुत की आपूर्ति नहीं की है, सबसे अच्छा मैं सिफारिश कर सकते हैं एक() में दिख रही है

http://api.jquery.com/one/

8

jQuery स्पार्कल "एक बार" फ़ंक्शन को कॉल करके एक बार एक ईवेंट को एक हाथ से बांधने के लिए एक साफ सुरुचिपूर्ण समाधान प्रदान करता है।

यह का उपयोग कर के रूप में डार्को जेड के सुझाव पर एक महत्वपूर्ण सुधार है:

$("#myButton").unbind("click").click(myHandler); 

"क्लिक" इस घटना के लिए हर बार यह कहा जाता है जुड़े किसी भी अन्य "क्लिक" संचालकों निकल सकते हैं। तो आप निश्चित रूप से सुनिश्चित करते हैं कि यह केवल एक बार बंधे हुए हैं, हालांकि आप गलती से सबकुछ अनइंड करें! ओह!

जेरेट का सुझाव "क्लिक" हैंडलर को सही कहने के बाद अनबिंड करता है, इसलिए यदि आप हैंडलर को फिर से बुलाया जाता है (इसकी प्रारंभिक आग के बाद) आपको हैंडलर को दोबारा जोड़ना होगा।

jQuery स्पार्कल का एक बार उपयोग करने से हैंडलर को जितनी बार आवश्यकता हो उतनी बार आग लगने की अनुमति होगी, लेकिन कई बार इसके बजाय केवल एक बार बांधने की अनुमति होगी। आप इसे इस तरह का उपयोग कर सकते हैं:

$('#myButton').once('click', function(){ 
    // my handler 
}); 

या यदि आपने अभी jQuery के "बाँध" में बनाया की तरह अपने कॉलबैक में डेटा का समर्थन करना चाहते हैं, तो आप उपयोग कर सकते हैं:

$('#myButton').once('click', data, function(){ 
    // my handler 
}); 

आप पा सकते हैं एक बार फ़ंक्शन here को परिभाषित करने के लिए स्रोत कोड।

यह एजीपीएल लाइसेंस के तहत खुला स्रोत है, इसलिए आप इससे निपटने के लिए स्वतंत्र महसूस कर सकते हैं कि आपको इससे क्या चिंता है! :-) यह दिन-दर-दिन आधार पर भी सक्रिय रूप से विकसित होता है ताकि आप कभी भी समर्थन पर कम न हों।

लेकिन सबसे महत्वपूर्ण बात यह है कि यह प्लगइन और एक्सटेंशन को और अधिक आसानी से विकसित करने की अनुमति देने के लिए एक DRY प्लगइन/प्रभाव फ्रेमवर्क है। तो उम्मीद है कि यह उस लक्ष्य को प्राप्त करने में मदद करता है!

+1

मुझे पता है कि यह पुराना है, लेकिन यह जवाब मुझे समाधान को सही करने के लिए ड्राइव करता है .. आज के jQuery संस्करण में मैंने उपयोग किया है। एक बाध्यकारी कार्य और मेरी समस्या हल हो गई है –

6

मेरे लिए यह

$(function() { 
    $('.some-element').click(function() { 
     //event that fires twice 
    }); 

    //some exception-throwing code here 
}); 

jQuery गुमनाम तैयार फ़ंक्शन को कॉल किया गया था दो बार (?!) अपवाद की वजह से क्लिक समारोह में दो बार के लिए बाध्य किया जाएगा ताकि संपन्न हुई थी।

4

आप $("div").one("click", function() { ... });

उपयोग कर सकते हैं तत्वों के लिए एक घटना के लिए कोई हैंडलर देते हैं। हैंडलर प्रति तत्व एक बार में निष्पादित किया जाता है।

jquery.com

1

से पहले यह मेरे लिए काम किया के बाद से मैं मूल रूप से इस्तेमाल किया था कुछ इस तरह कॉलिंग $ ('# myButton')। पर ('क्लिक' ... मेरे श्रोताओं आवंटित करने के लिए।

$('#myButton').off(); 

Documentation for "off();"

3

यह अच्छी तरह से काम करेगा। यह मेरे लिए काम करते हैं।

1

मुझे मोडल संवाद विंडो में कोई समस्या थी। प्रत्येक बार जब मैंने सत्र में एक संवाद खोला था तो घटना एक बार निकाल दी गई थी। पहली खिड़की पर कोई समस्या नहीं, दूसरी खिड़की पर दो बार निकाल दिया गया, तीसरी खिड़की पर तीन बार निकाल दिया गया, आदि

मैंने पाया कि संवाद के लिए प्रारंभिक कार्य प्रत्येक बार बुलाया जा रहा था जब मैंने एक नई संवाद विंडो खोली एक ही सत्र मैंने एक ग्लोबल वैरिएबल notInit = -1 जोड़ा और init चलाते समय मान को 1 असाइन किया। मैंने init फ़ंक्शन चलाने से पहले INInit के मान की जांच की और मान -1 के साथ केवल init के साथ आगे बढ़े।

+0

ऐसा लगता है कि मैं कुछ चाहता हूं लागू करने की तरह, लेकिन मुझे वाक्य वाक्यविन्यास के बारे में निश्चित नहीं है। यदि यह बहुत अधिक लेखन नहीं है, तो क्या आप अपने उत्तर में एक कोड स्निपेट प्रदान करेंगे? – Chris22

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