2010-01-11 8 views
4

J'essaie de configurer un événement click sur un div, et je voudrais que cet événement se déclenche si ce div est cliqué n'importe où sauf une case à cocher dans le div. Si la case est cochée, je ne veux pas déclencher l'événement click de div. Je configure un événement click sur la case à cocher et renvoie false, ce qui arrête l'événement click de div, mais ne permet pas non plus de cocher la case. Voici ce que j'ai maintenant:jQuery - Cliquez sur l'événement sur div mais pas sur la case

$('.theDiv').click(function() { 
    // Click event for the div, I'm slide toggling something 
    $('.sub-div', $(this)).slideToggle(); 
}); 

$('.checkboxInTheDiv').click(function() { 
    // Do stuff for the checkbox click, but dont fire event above 
    return false; // returning false won't check/uncheck the box when clicked 
}) 

Répondre

14

Au lieu de retourner false, ce qui empêche l'action par défaut, essayez d'arrêter la propagation.

$('.checkboxInTheDiv').click(function(e) { 
    e.stopPropagation(); 
    ... other stuff... 
    return true; 
}); 
+1

est ici une bonne façon de faire ce qui précède: http://www.quirksmode.org/js/events_order.html –

+0

fonctionne très bien, Merci! – Ryan

+0

incroyable. Je luttais avec la réécriture de mon code HTML pendant un moment. Merci! –

3

Vous aurez besoin de regarder l'objet event passé dans le gestionnaire de clic et voir quel type il est. Regardez la documentation Event.Type pour plus d'informations.

function handler(event) { 
    var $target = $(event.target); 
    if($target.is("li")) { 
    $target.children().toggle(); 
    } 
} 

$("ul").click(handler).find("li > ").h 

Note: le code copié à partir d'URL lié.

+0

Cette réponse est particulièrement utile car elle fonctionne même lorsque l'événement est lié à l'aide de la méthode '.live()'. –

0

Essayez simple return;