2010-12-13 89 views
11

J'utilise le code suivant pour animer un bloc. Dans mon code, div_animate() masque essentiellement un <div> avec le sélecteur spécifié s'il est actuellement visible.Comment puis-je utiliser jQuery pour déterminer si un événement click se déclenche dans un élément spécifique?

$(document).click(function(event){ 
    div_animate("#container"); 
}); 

Je dois déterminer si l'utilisateur a cliqué sur un enfant de #container et si oui, return false; - pour autant que je peux dire, le code pour cela ressemblerait à quelque chose comme ceci:

$(document).click(function(event){ 
    if (/* the event's target has a parent of #container */) { 
     return false; 
    } else { 
     div_animate("#container"); 
    } 
}); 

Des pensées?

+0

Est-ce la même question que [votre question précédente] (http://stackoverflow.com/questions/4430277/jquery-animate-quand-div-loses-focus) où je vous ai donné [ce lien] (http://stackoverflow.com/questions/714471/jquery-hide-element-when-clicked-anywhere-on- la page)? – user113716

+0

@patrick Ce n'est pas la même chose que ma question précédente, mais elle est liée - cette question est survenue lorsque j'ai ajouté la solution de la question précédente. Alors que votre lien était similaire à ma question initiale, je ne l'ai pas trouvé utile. – Jazzerus

Répondre

26

La chose serait plus simple:

if ($(event.target).is('#container *, #container')) // edited - thanks @gnarf 
    // is a child 
else 
    // is not a child 

Il y a des choix différents que vous pouvez faire pour détecter que ce soit un enfant du conteneur cible (ou non-cible); c'est juste un. Une alternative:

if ($(event.target).closest('#container').length) 
+1

Cela ne trouverait pas '# conteneur 'tout seul ... Peut-être' $ (event.target) .closest (' # container '). Longueur' ou '.is (' # conteneur, #container * ') ' – gnarf

+1

C'est exactement ce que je veux. Merci pour la réponse rapide! – Jazzerus

+1

@gnarf ah oui tu as raison - j'avais déjà ajouté l'alternative "la plus proche" mais je vais réparer la première. – Pointy

8

Vous pouvez empêcher l'action si le clic origine ou dans #container, comme ceci:

$(document).click(function(event){ 
    var c = $("#container")[0]; 
    if (event.target == c || $.contains(c, event.target)) { 
     return false; 
    } else { 
     div_animate("#container"); 
    } 
}); 

Le premier chèque est si elle venait de se #container, le second est si est venu d'un enfant, que #container$.contains(). Une façon tout à fait autre, plus simple est d'empêcher que la bulle jusqu'à document en cliquant sur #container, comme ceci:

$("#container").click(function(e) { 
    e.stopPropagation(); 
}); 
$(document).click(function() { 
    div_animate("#container"); 
}); 
+0

Voici mon occasion en or de vous châtier pour ne pas mettre en cache cette recherche "#container", mais je parie que vous l'aurez édité au moment où j'ai fini de taper ce commentaire :-) – Pointy

+0

@Pointy - Il a été mis en cache en tant qu'élément DOM dans la première version postée ... –

+0

Non je voulais dire caché dans une fermeture autour de la fonction de gestionnaire ou quelque chose, bien que la plupart du temps je plaisantais. – Pointy