2010-08-12 13 views
23

मैं लिंक और वस्तुओं पर कई क्लिक रोकने की कोशिश कर रहा हूं, जो समस्याएं पैदा कर रहा है।jQuery एक क्लिक के बाद अन्य घटनाओं को रोकता है

मैं बटन (jQuery UI) और छवि लिंक (<a><img /></a>) पर क्लिक ईवेंट को बाध्य करने के लिए jQuery का उपयोग कर रहा हूं।

क्या ऐसा करने का कोई तरीका है-एक-दूसरे के लिए एक क्लिक होने के बाद फायरिंग से अन्य घटनाओं को रोकने के लिए?

या क्या मुझे _isProcessing नामक वैश्विक चर को बनाए रखना है और इसे प्रत्येक ईवेंट हैंडलर के लिए सही पर सेट करना है?

धन्यवाद

संपादित करें: (स्पष्टीकरण) अपने जवाब के लिए धन्यवाद, मेरी समस्या घटना के उत्साह से भरा हुआ रोकने नहीं है, लेकिन कई समवर्ती क्लिक से बचने।

+1

* "अन्य घटनाओं" * से आपका क्या मतलब है? अन्य घटना हैंडलर एक ही तत्व पर? या अपने पूर्वजों के तत्वों पर? या पूरे पृष्ठ पर? क्या आप अपनी विशिष्ट आवश्यकता को स्पष्ट कर सकते हैं? – user113716

+0

तो अगर मेरे पास "सेवा जोड़ें" नामक एक छवि लिंक है, जो मेरे पृष्ठ पर एक तालिका में एक पंक्ति जोड़ता है। यदि मैं एक से अधिक बार क्लिक करता हूं तो यह दो जोड़ता है। क्लिक करने के बाद teh समय में कोई अन्य पंक्तियां नहीं जोड़नी चाहिए, और पंक्ति बनने से पहले। – Russell

+0

@Russell - हाँ, मैंने इसे संबोधित करने के लिए नीचे एक उत्तर जोड़ा। – user113716

उत्तर

29

कोड चलाने से समवर्ती क्लिक को रोकने के कई तरीके हैं।

तत्व पर unbind('click') का एक तरीका है, तो .bind() फिर से तैयार होने पर इसे फिर से करें।

मैं कुछ प्रकार के ध्वज का उपयोग करना चाहता हूं। यह एक चर हो सकता है, लेकिन मैं तत्व को कक्षा को असाइन करना चाहूंगा, जैसे .processing, और इसे पूरा होने पर हटा दें। इसलिए आपके पास उस वर्ग के अस्तित्व के लिए हैंडलर चेक होगा जो कोड को निर्धारित करने के लिए निर्धारित करना चाहिए।

$('someElement').click(function() { 
    var $th = $(this); 
    if($th.hasClass('processing')) 
      return; 
    $th.addClass('processing'); 
    // normal code to run 
    // then when done remove the class 
    $th.removeClass('processing'); 
}); 

एक अन्य विकल्प तत्वों .data() का उपयोग $(this).data('processing', true); जैसे एक समान ध्वज सेट करने के लिए, तो गलत पर सेट हो जाने के लिए है।

+0

@ elo80ka - धन्यवाद। मेरी इच्छा है कि jQuery में '.disableHandler (' क्लिक ')' और '.enableHandler ('क्लिक') 'के विकल्प के रूप में कुछ था।'bind()/unbind()' और कुछ हद तक अव्यवस्थित/हैकिश समाधान जैसे वर्ग या चर का उपयोग करना झंडे के रूप में। : ओ) – user113716

+0

आपको कक्षा को जोड़ने के बजाय .data() फ़ंक्शन का उपयोग करना चाहिए जो तत्व के प्रदर्शन को गलती से प्रभावित कर सकता है। – bcherry

+0

@bcherry - कक्षा का उपयोग करने के बारे में अच्छी बात यह है कि यह है (मुझे यकीन है कि) '.data() 'का उपयोग करने से हल्का वजन ऑपरेशन है। यदि आप अपनी कक्षा का नामकरण करने से सावधान हैं, तो कोई प्रदर्शन रैमिकेशन नहीं होना चाहिए। – user113716

7

क्या आपने रोकथाम की जांच की है?

$("a").click(function(e) { 
    e.preventDefault(); 
} 

आप भी stopImmediatePropagation() या stopPropagation()


की कोशिश कर सकते तुम भी one() घटना पर गौर कर सकता है।

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

+0

'e.preventDefault() 'विधि वास्तव में हैंडलर को नहीं रोकती है। यह किसी तत्व के सक्रिय व्यवहार को सक्रिय करने से रोकता है (जैसे ' 'आपको अपने' href' स्थान पर ले जा रहा है)। – user113716

+1

ई.स्टॉपआईमीडिएटप्रॉपेशन(); काम किया। धन्यवाद! इसके अलावा, unbind इस्तेमाल किया। – techdude

+0

एक() ने मेरे मामले में मदद की जहां घटना हर क्लिक के लिए फायरिंग थी। धन्यवाद! – planetregin

3
आपके घटना संचालकों से

वापसी false, या हर हैंडलर में ev.stopPropagation() कहते हैं।

+0

का उपयोग करें .stopPropagation() – Mark

+0

@ मार्क - प्रश्न को दोबारा पढ़ें। * "मेरी समस्या घटना के बुलबुले को रोक नहीं रही है," * – user113716

+0

मैंने अपना उत्तर पोस्ट करने के बाद प्रश्न को स्पष्ट किया। – Russell

19

event.preventDefault, event.stopPropagation है और पहले से ही बताया गया है कि झूठी वापसी।

$("a").click(function(e) { 
    e.preventDefault(); 
    e.stopPropagation(); 
    return false; 
} 
+0

:-) अच्छे उपाय के लिए ... (हालांकि सवाल अलग है, मुझे लगता है ...) –

+0

हाँ, जब मैंने उत्तर दिया तो अभी तक स्पष्ट नहीं किया गया था। – TehOne

+0

हाँ क्षमा करें @TehOne, मैंने पहली बार अपने प्रश्न को ठीक से व्यक्त नहीं किया। – Russell

2

आप विकल्पों में से एक जोड़े को मिल गया है:

  1. यदि आपका बटन/लिंक पृष्ठ पुनः लोड होगा, तो आप बस क्लिक ईवेंट हैंडलर निकल कर सकते हैं:

    $('input:submit').click(fumction() { 
        $(this).unbind('click'); 
        // Handle event here 
    }) 
    
  2. आप बटन अक्षम कर सकते हैं, और एक बार पूरा होने के बाद उन्हें पुनः सक्षम कर सकते हैं (मुझे लगता है कि यह <input type="image"> के साथ भी काम करना चाहिए):

    $('input:submit').click(function() { 
        $(this).attr('disabled', 'disabled'); 
        // It also helps to let the user know what's going on: 
        $(this).val('Processing...'); 
        // Handle event here 
        $(this).removeAttr('disabled'); 
    }) 
    

    मुझे नहीं लगता कि यह लिंक पर काम करता है।

+0

क्या आप जानते हैं कि घटनाओं को अक्षम करने का कोई तरीका है (असंबद्ध नहीं, बस अक्षम करें)? – Russell

+0

@Russell: आप इनपुट तत्वों को अक्षम कर सकते हैं। जहां तक ​​मुझे पता है, अक्षम तत्व घटनाओं को नहीं बढ़ाते हैं। – elo80ka

+0

हाँ, लेकिन एक छवि लिंक (एंकर), उदाहरण के लिए, एक क्लिक ईवेंट बढ़ा सकता है लेकिन इनपुट फ़ील्ड नहीं है (जैसा कि आपने कहा था, एंकर तत्वों को अक्षम करना काम नहीं करता है)। – Russell

2

एक और तरीका है संकेतन के लिए event.stopPropagation() और event.isPropagationStopped() उपयोग करने के लिए होगा:

उदाहरण:

$(button).click(function(e){ 
    if(e.isPropagationStopped()) 
     return; // propagation was stopped, so stop further execution 

    // if you got this far - this event handler was called first 
    // custom logic goes here 

    // stop event propagation to signal other handlers 
    e.stopPropagation(); 

    // if you need, call e.preventDefault() to prevent default behaviour 
}); 

दोहराएँ अन्य घटना संचालकों के लिए एक ही तर्क।

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