2011-09-16 16 views
7

जब मैं बच्चे और माता-पिता पर ईवेंट को बाध्य करने के लिए बाध्य करता हूं, तो बाल घटना वापसी झूठ के साथ घटना के प्रचार को रोक सकती है; लेकिन जब मैं प्रतिनिधि का उपयोग करता हूं, झूठी वापसी करता हूं; घटना प्रसार रोक नहीं है।प्रतिनिधि का उपयोग करते समय ईवेंट प्रचार को कैसे रोकें?

http://jsfiddle.net/J3EAQ/

एचटीएमएल:

<div class="parent"> 
    <div class="child"></div> 
    <div class="child"></div> 
</div> 

js:

$('.parent').delegate('.child','click',function(e){ 
    alert('child click'); 
    return false; 
}); 
$('.parent').bind('click',function(e){ 
    alert('parent click'); 
}); 
+0

संभावित डुप्लिकेट? http://stackoverflow.com/questions/1357118/javascript-event-preventdefault-vs-return-false –

उत्तर

8

e.stopPropagation() इस मामले में काम नहीं करेंगे। इसके बजाय e.stopImmediatePropagation() का उपयोग करें। यहां एक fiddle

+0

हां, यही वह समाधान है जिसे मैं ढूंढ रहा था। धन्यवाद! – codez

1

आप e.stopPropagation() का उपयोग करना चाहिए प्रचार को रोकने के लिए, झूठी वापस लौट कर नहीं।

return false तकनीकी रूप से दो चीजें हैं; 1) डिफ़ॉल्ट कार्रवाई को रोकें, और 2) प्रचार रोकें। e पर विधि आमंत्रण पर स्विच करने का प्रयास करें और देखें कि क्या यह आपकी समस्या को हल करता है या नहीं।

+0

अभी भी इस समस्या को हल नहीं करता –

+0

@Interstellar_Coder - सही, आपका समाधान बेहतर है। 'स्टॉपइमीडिएटप्रॉपेशन() 'के बारे में कभी नहीं पता था। धन्यवाद! – Tejs

4

क्यों दो क्लिक संचालकों आप एक हो सकता है जब:

$('.parent').click(function (e) { 
    if ($(e.target).is('.child')) { 
     alert('child click'); 
    } else { 
     alert('parent click'); 
    }  
}); 

लाइव डेमो:http://jsfiddle.net/J3EAQ/2/


इस पद्धति का एक सामान्यीकरण:

$(element).click(function (e) { 
    if (e.target === this) { 
     // this element was clicked directly 
    } else { 
     // this element was NOT clicked directly 
     // a descendant of this element was clicked 
    }  
}); 

अलग हैंडलर?

$('.parent').click(function (e) { 
    if (this ==== e.target) { 
     parentClicked.call(e.target, e); 
    } else { 
     childClicked.call(e.target, e); 
    }  
}); 

function childClicked(e) { 
    // child click handler 
} 

function parentClicked(e) { 
    // parent click handler 
} 
+0

तकनीकी रूप से यह समस्या हल करता है, लेकिन मुझे विभिन्न तत्वों की कार्यक्षमता को अलग करना पसंद है, इसलिए मुझे 2 ईवेंट हैंडलर के साथ समाधान की आवश्यकता है। – codez

+0

फिर '.delegate' का उपयोग न करें, बस दोनों स्थानों पर' .click' का उपयोग करें। – Blazemonger

+0

@codez आप भी यह प्राप्त कर सकते हैं। मेरा अपडेट देखें। –

0

तुम हमेशा उपयोग कर सकते हैं e.stopPropagation()

+0

काम नहीं करता है: http://jsfiddle.net/J3EAQ/3/ – codez

-1

आपके घटना प्रचारित नहीं किया जा रहा है। आप .parent पर एक क्लिक हैंडलर बाध्यकारी हैं, और आप .parent

0

मेरे लिए क्या काम किया गया क्लिक क्लिकर में क्लिक लक्ष्य के वर्ग का नाम जांचना था जिसे आप अन्य क्लिक ईवेंट द्वारा ट्रिगर नहीं करना चाहते हैं। कुछ इस तरह।

if(e.target.className.toString().indexOf("product-row") > -1){ 
     // Only do stuff if the correct element was clicked 
    } 
संबंधित मुद्दे