2009-03-16 19 views
43

मेरे पास दो अलग-अलग समय (jQuery का उपयोग करके) पर एक क्लिक ईवेंट के लिए दो कार्य हैं। जिस क्रम में उन्हें निकाल दिया गया है वह महत्वपूर्ण है। वे सही क्रम में फायरिंग कर रहे हैं। समस्या यह है कि, जब पहला फ़ंक्शन झूठा लौटाता है, तो दूसरा फ़ंक्शन अभी भी फायरिंग हो रहा है!jQuery एकाधिक ईवेंट हैंडलर - कैसे रद्द करें?

मैं ईवेंट को सही तरीके से कैसे रद्द कर सकता हूं?

उदाहरण कोड:

$(document).click(function() { 
    alert('a'); 
    return false; 
}); 

$(document).click(function() { 
    alert('b'); 
}); 

तुम अब भी जब पेज पर क्लिक "बी" चेतावनी संदेश दिखाई देगा। यह अस्वीकार्य है!

उत्तर

82

jQuery ईवेंट ऑब्जेक्ट के stopImmediatePropagation फ़ंक्शन का उपयोग करें।

बाकी हैंडलर को निष्पादित होने से रोकता है। यह विधि event.stopPropagation() को कॉल करके बुलबुले को भी रोक देती है।

$(document).click(function(event) { 
    alert('a'); 
    event.stopImmediatePropagation(); 
    return false; 
}); 

$(document).click(function() { 
    alert('b'); 
}); 
+1

आप यह ध्यान रखना चाहते हैं कि काम करने के लिए आपको jQuery संस्करण 1.3 और ऊपर का उपयोग करने की आवश्यकता है। –

+0

$ (दस्तावेज़) .on ("टचस्टार्ट क्लिक", ".myelement", फ़ंक्शन (ई) {e.stopImmediatePropagtion(); // रन फ़ंक्शन यहां}) ... अगर टचस्टार्ट टैबलेट डिवाइस पर पहले आग लगती है अगर मैं अपनी उंगली को दबाता हूं तो क्या यह फायरिंग से क्लिक रद्द कर देगा? – Alex

1

असंबद्ध मदद का उपयोग कर रहा है?

$(document).click(function() { 
    alert('a'); 
    $(this).unbind('click'); 
    return false; 
}); 
+3

मुझे अभी भी मेरी दूसरी घटना की आवश्यकता है जब पहला फ़ंक्शन झूठी वापसी न करे। सचमुच "इसे बाध्य" नहीं कर पाएंगे? –

+0

हाँ। यह शायद कुल मिलाकर एक अच्छा समाधान नहीं है ... – nickf

+0

आप निक समाधान के साथ अपना समाधान मर्ज कर सकते हैं और आपको अपना व्यवहार मिल जाएगा :) – fmsf

0

यदि nickf कहा काम नहीं करता है, तो आप एक छोटे से राज्य मशीन इस्तेमाल कर सकते हैं:

var trigger = 0; 

$(document).click(function() { 

    alert('a'); 
    if(you_want_to_return_false) { 
    trigger = 1; 
    return false; 
    } 
}); 

$(document).click(function() { 
    if(trigger !== 0) { 
    alert('b'); 
    } 
    trigger = 0; 
}); 

नहीं सुंदर समाधान है, लेकिन यह काम करेंगे।

+0

अच्छी तरह से, मेरा विचार * काम करता है * यह सिर्फ यह है कि यह एक ही समय में इसे तोड़ देता है। यद्यपि इस विचार के लिए +1। – nickf

+0

यह विधि ठीक उसी तरह टूट जाती है जैसे अन्य कोड करता है, और कोड के अलावा। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं। –

+0

क्षमा करें मुझे इसे दोबारा – fmsf

2

पहली बात जो मैं पूछ रहा हूं वह है: क्यों आपके पास दो फ़ंक्शन एक ही क्लिक ईवेंट से बंधे हैं? कोड तक पहुंचने के बाद, आप केवल एक ही कॉल क्यों नहीं करते?

$(function(){ 
    var callbackOne = function(e){ 
     alert("I'm the first callback... Warning, I might return false!"); 
     return false; 
    }; 

    var callbackTwo = function(e){ 
     alert("I'm the second callback"); 
    }; 

    $(document).click(function (e){ 
     if(callbackOne(e)){ 
      callbackTwo(e); 
     } 
    }); 
}); 
+4

संगठन दोबारा दें। इस ऐप में जावास्क्रिप्ट कोड का एक टन है, और इसे अलग फाइलों में विभाजित किया गया है। इस तरह, प्रत्येक पृष्ठ केवल आवश्यक है डाउनलोड करता है, जिसके परिणामस्वरूप तेज़ लोड समय होता है। मेरे पास एक HTTP हैंडलर है जो उन्हें जोड़ता है, संकुचित करता है, और उन्हें कैश भी करता है, इसलिए वे सभी एक अनुरोध में लाए जाते हैं। –

+0

ठीक है। तो क्या वास्तव में -1 की आवश्यकता है? बस मदद करने की कोशिश कर रहा है ... आपकी व्याख्या हमें सभी को यह बताने के लिए पर्याप्त है कि यह आपके लिए * समाधान नहीं है *। – Seb

+1

मैंने -1 नहीं किया, दोस्त! –

2

धन्यवाद, कार्यों को पुनर्परिभाषित करने के लिए काम करता है निकल।

$(document).ready(function(){ 
     $("#buscar_mercaderia").click(function(){ alert('Seleccione Tipo de mercaderia'); 
    }); 
$(".tipo").live('click',function(){ 
      if($(this).attr('checked')!=''){ 
       if($(this).val()=='libro'){ 
        $("#buscar_mercaderia").unbind('click'); 
        $("#buscar_mercaderia").click(function(){ window.open('buscar_libro.php','Buscar Libros', 'width=800,height=500'); }); 
       }else if($(this).val()=='otra'){ 
        $("#buscar_mercaderia").unbind('click'); 
        $("#buscar_mercaderia").click(function(){ window.open('buscar_mercaderia.php','Buscar Mercaderias', 'width=800,height=500'); }); 
       } 
      } 
     }) 
संबंधित मुद्दे