2012-04-15 25 views
18

dışında, Div On Etkinlik'i tıklayın Aşağıdaki HTML vardır: Kullanıcıların bir düzenleme iletişim kutusunu getirir server div tıkladığınızda öyle yapmaya çalışıyorumjQuery Çocuk Div ​​

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

. Sorun basitçe yapıyor:

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

Çalışmaz, onlar silmek X tıklamanız durumunda, bu düzenleme iletişim kutusunu getirir çünkü. server tüm div toplamı, delete-server div dışında tıklama olayına sahip olabilir.

+0

Kabul edilen yanıtın delege arifesinde kullanıldığını bilmelisiniz iyi bir sebep için nt. ne yaptığını öğrenmek için '' 'docs (http://api.jquery.com/on/) 'ı okuyabilirsiniz. – gdoron

+0

@gdoron - Etkinlik temsilcisinin daha yavaş olduğu iddianız için bir kaynak sunabilir misiniz? AFAIK, etkinlik heyeti yaptığınız şeyle aynı şeyleri yapıyor; Hedef elemanın seçilen seçiciyle eşleşip eşleşmediğini kontrol eder. Yine de yanılıyor olabilirim ve aydınlanmayı çok isterim. –

+0

ilgili http://stackoverflow.com/questions/12690313/jquery-on-click-on-everything-but-a-div-and-its-children/12690357 –

cevap

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

keman var: http://jsfiddle.net/9bzmz/3/

+0

teşekkürler ondan yeni bir şey öğrendim .. :-) – Peeyush

+0

Bildiri, SERVER NAME 'i tıklayın, uyarı neden iki kez ateşleniyor? http://jsfiddle.net/9bzmz/1/ – Justin

+0

@Justin SUNUCU Adı'na tıkladığınızda yanınızda 2 uyarı kutusu gösteriliyor mu? – Peeyush

12

Sadece olayı tetikleyen unsur ne olduğunu kontrol:

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

LIVE DEMO İşte

+0

Hala X'i tıklatırken düzenleme iletişimini görüyorum, düşünüyorum Bunun nedeni, tıklama etkinliğinin '.server'de tetiklenmesidir, bu nedenle çocuk div' .delete-server' hakkında bilgi yoktur. – Justin

+0

@Justin. Güncellenmiş cevabı kontrol edin. Kabul edilen cevabınızın “doğrudan olay” yerine “delege olayı” oluşturduğunun farkında olmanız gerekir, bu da daha yavaştır ve bunu yapmak için bir neden yoktur. Temsilci olayı dinamik olarak DOM yapısını değiştirmek için kullanılmalıdır. – gdoron

+0

Lütfen, olay temsilcisinin daha yavaş olduğu iddianız için bir kaynak sunabilir misiniz? AFAIK, etkinlik heyeti yaptığınız şeyle aynı şeyleri yapıyor; Hedef elemanın seçilen seçiciyle eşleşip eşleşmediğini kontrol eder. Yine de yanılıyor olabilirim ve aydınlanmayı çok isterim. –

6

bu çözmek için alternatif bir yol yoktur:

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

Yalnızca, .delete-server numaralı belgede yayınlanan tıklama olayının ana öğeye yetişmediğinden emin olun.

+0

+1 Güzel yol, iki hedefleyici kullanıyor olsa da 'hedef' elemanını kontrol ederek yapılabilir. [bunu kontrol et] (http://stackoverflow.com/a/10160231/601179) – gdoron

+0

@gdoron Evet, ama bu zarafet nerede olurdu? Bu, olayın gerçekte ne yapması gerektiğini * belirlemek için 'if'/'anahtarıyla bir tek olay işleyicisine yol açacaktır. Bunu oldukça kötü kokulu olarak düşünürdüm. – Tomalak

+0

Şey .. yanlış bir yol yok, benimkini daha çok seviyorum. Her yol iyi bir sebepten dolayı delege etkinliğini kullanan kabul edilen cevaptan daha iyidir ... :) – gdoron

0

Sadece bu benim için çalışır.

js_object

davanızı Fore bir $('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 
}); 

gibi meta ebeveyn için jQuery nesnesidir:

sunucusu - js ebeveynli

silme-sunucu - js-çocuk-1

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

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