2011-11-14 3 views
29

में पहले हैंडलर से, अन्य ईवेंट हैंडलर को कैसे रोकें यदि आप एक HTML तत्व में दो या अधिक ईवेंट हैंडलर संलग्न करते हैं, तो उन्हें एक के बाद एक निष्पादित किया जाएगा। हालांकि, अगर आप पहले हैंडलर में चेक की गई शर्त के आधार पर आगामी ईवेंट हैंडलर को रोकना चाहते हैं, तो आपको क्या करना चाहिए?jQuery के

उदाहरण के लिए:

<div id='target'> 
</div> 

<p id='result'> 
</p> 

मैं अगर पहले हैंडलर को रोकने के बाद दूसरा हैंडलर रद्द करना चाहते हैं।

$(function() { 
    var target = $('#target'), 
     result = $('#result'); 
    target.click(function(e) { 
     result.append('first handler<br />'); 
     // Here I want to cancel all subsequent event handlers 
    }); 
    target.click(function(e) { 
     result.append('second handler<br />'); 
    }); 
}); 

आप पहेली here देख सकते हैं।

पुनश्च: मुझे पता है कि e.preventDefault() (उदाहरण के लिए, एक HTTP GET अनुरोध को रोकने के लिए एक लिंक पर क्लिक करें की वजह से भेजा जा रहा है) HTML तत्व का डिफ़ॉल्ट कार्रवाई रोकता है, और e.preventPropagation() अपनी मूल तत्वों को प्रचारित किए जाने से घटना का कारण बनता है डोम पेड़ में। मुझे यह भी पता है कि एक मध्यम चर का उपयोग करना संभव है, इसे पहले हैंडलर में सही पर सेट करें, और इसे बाद के हैंडलर में जांचें। लेकिन मैं देखना चाहता हूं कि इस समस्या के लिए एक अधिक साफ, परिष्कृत समाधान है या नहीं।

उत्तर

43

event.stopImmediatePropagation() देखें - http://api.jquery.com/event.stopImmediatePropagation/

jQuery एपीआई डॉक्स, इस विधि के अनुसार:

निष्पादित किया जा रहा से संचालकों के बाकी रहता है और डोम पेड़ खलबली मचाने वाले से घटना को रोकता है।

+0

मैं अद्यतन [बेला] (http://jsfiddle.net/saeedneamati/pFp7P/2/) आपका जवाब प्रतिबिंबित करने के लिए। +1 और धन्यवाद। –

1

समाधान ब्राउज़र विशिष्ट है। dojo.stopEvent देखें:

dojo.stopEvent = function(/*Event*/ evt){ 
    // summary: 
    //  prevents propagation and clobbers the default action of the 
    //  passed event 
    // evt: Event 
    //  The event object. If omitted, window.event is used on IE. 
    if(has("dom-addeventlistener") || (evt && evt.preventDefault)){ 
     evt.preventDefault(); 
     evt.stopPropagation(); 
    }else{ 
     evt = evt || window.event; 
     evt.cancelBubble = true; 
     on._preventDefault.call(evt); 
    } 
}; 

अपडेट किया गया बेला: http://jsfiddle.net/pFp7P/1/

+0

यह प्रश्न jQuery – Bill

+0

से संबंधित है यह एक मूल समाधान है; क्या यह अब w/jQuery काम नहीं करता है? – fncomp

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