2012-04-15 18 views
18

सिवाय मैं निम्न HTML है:jQuery डिव पर क्लिक करके ईवेंट, बाल डिव

<div class="server" id="32"> 
    <a>Server Name</a> 
    <div class="delete-server">X</div> 
</div> 

मैं यह इतना बनाने के लिए उपयोगकर्ताओं द्वारा क्लिक server div यह एक संपादन संवाद को लाता है कोशिश कर रहा हूँ। समस्या बस कर रही है:

$(".server").click(function() { 
    //Show edit dialog 
}); 

काम नहीं करता है, क्योंकि अगर वे हटाए गए एक्स पर क्लिक करते हैं, तो यह संपादन संवाद लाता है। पूरे div server को delete-server div को छोड़कर क्लिक ईवेंट कैसे बना सकता है।

+0

आपको अवगत होना चाहिए कि आपका स्वीकृत उत्तर प्रतिनिधि पूर्व संध्या का उपयोग करता है कोई अच्छा कारण नहीं है। आप यह जानने के लिए 'ऑन' [डॉक्स] (http://api.jquery.com/on/) पढ़ सकते हैं। – gdoron

+0

@gdoron - क्या आप कृपया अपने दावे के लिए एक स्रोत प्रदान कर सकते हैं कि घटना प्रतिनिधिमंडल धीमा है? AFAIK, घटना प्रतिनिधिमंडल वही काम करता है जो आपने किया था, लेकिन दृश्यों के पीछे; यह जांचता है कि लक्ष्य तत्व दिए गए चयनकर्ता से मेल खाता है या नहीं। हालांकि मैं गलत हो सकता हूं, और प्रबुद्ध होना पसंद करेंगे। –

+0

संबंधित http://stackoverflow.com/questions/12690313/jquery-on-click-on-everything-but-a-div-and-its-children/12690357 –

उत्तर

21
$(".server").on('click', ':not(.delete-server)', function (e) { 
    e.stopPropagation() 
    // Show edit dialog 
}); 

यहाँ बेला है: http://jsfiddle.net/9bzmz/3/

+0

धन्यवाद मैंने उससे कुछ नया सीखा .. :-) – Peeyush

+0

नोटिस, सर्वर नाम पर क्लिक करें, अलर्ट फायरिंग दो बार क्यों है? http://jsfiddle.net/9bzmz/1/ – Justin

+0

@ जस्टिन तो क्या यह SERVER नाम पर क्लिक करते समय आपकी तरफ से 2 अलर्ट बॉक्स दिखा रहा है? – Peeyush

12

बस जाँच तत्व जो ईवेंट ट्रिगर किया क्या:

$(".server").click(function(e) { 
    if (!$(e.target).hasClass('delete-server')) { 
     alert('Show dialog!'); 
    } 
});​ 

LIVE DEMO

+0

एक्स पर क्लिक करते समय भी संपादन संवाद आ रहा है, मुझे लगता है ऐसा इसलिए है क्योंकि क्लिक इवेंट '। सर्वर' पर गोलीबारी कर रहा है, इसलिए यह बच्चे div '.delete-server' के बारे में नहीं जानता है। – Justin

+0

@ जस्टिन। अद्यतन उत्तर देखें। आपको इस बात से अवगत होना चाहिए कि आपके स्वीकृत उत्तर 'प्रत्यक्ष घटना' के बजाय 'प्रतिनिधि ईवेंट' बनाते हैं, जो धीमा है, और इसका कोई कारण नहीं है। प्रतिनिधी घटना का उपयोग गतिशील रूप से डीओएम संरचना को बदलने के लिए किया जाना चाहिए। – gdoron

+0

क्या आप कृपया अपने दावे के लिए एक स्रोत प्रदान कर सकते हैं कि घटना प्रतिनिधिमंडल धीमा है? AFAIK, घटना प्रतिनिधिमंडल वही काम करता है जो आपने किया था, लेकिन दृश्यों के पीछे; यह जांचता है कि लक्ष्य तत्व दिए गए चयनकर्ता से मेल खाता है या नहीं। हालांकि मैं गलत हो सकता हूं, और प्रबुद्ध होना पसंद करेंगे। –

6

इस हल करने के लिए एक वैकल्पिक तरीका है:

$(".server").click(function() { 
    // show edit dialog 
}); 
$(".delete-server").click(function (event) { 
    // show delete dialog for $(this).closest(".server") 
    event.stopPropagation(); 
}); 

बस सुनिश्चित करें कि .delete-server पर जारी एक क्लिक ईवेंट मूल तत्व तक बबल नहीं होता है।

+0

+1 अच्छा तरीका, हालांकि यह दो हैंडलर का उपयोग करता है, जबकि इसे 'लक्ष्य' तत्व की जांच के साथ किया जा सकता है। [इसे जांचें] (http://stackoverflow.com/a/10160231/601179) – gdoron

+0

@gdoron हां, लेकिन इसमें लालित्य कहां होगा? यह एक इवेंट हैंडलर को 'if'/'switch' चेक के साथ जांचने के लिए प्रेरित करेगा ताकि यह निर्धारित किया जा सके कि ईवेंट वास्तव में क्या करना है। मैं इसे बदबूदार मानता हूं। – Tomalak

+0

अच्छा .. कोई गलत तरीका नहीं है, मुझे बेहतर पसंद है। प्रत्येक तरीका बेहतर है तो स्वीकार किए गए उत्तर जो किसी भी अच्छे कारण के लिए प्रतिनिधि कार्यक्रम का उपयोग नहीं करता है ... :) – gdoron

0

केवल यह मेरे लिए काम करता है।

js_object एक $('body')

jq_object.on('click', '.js-parent :not(.js-child-1, .js-child-2)', function(event) { 
    //your code 
}); 

jq_object.on('click', '.js-child-1', function(event) { 
    //your code 
}); 

jq_object.on('click', '.js-child-2', function(event) { 
    //your code 
}); 

अपने मामले सामने की तरह मेटा माता-पिता के लिए jQuery वस्तु है:

सर्वर - js माता पिता

हटाना सर्वर - js वाले बच्चे -1

jq_object.on('click', '.server :not(.delete-server)', function(event) { 
    //your code 
}); 

jq_object.on('click', '.delete-server', function(event) { 
    //your code 
}); 
संबंधित मुद्दे