120 votes

Vérifier si un élément est un enfant d'un parent

J'ai le code suivant.

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</head>

<div id="hello">Hello <div>Child-Of-Hello</div></div>
<br />
<div id="goodbye">Goodbye <div>Child-Of-Goodbye</div></div>

<script type="text/javascript">
<!--
function fun(evt) {
    var target = $(evt.target);    
    if ($('div#hello').parents(target).length) {
        alert('Your clicked element is having div#hello as parent');
    }
}
$(document).bind('click', fun);
-->
</script>

</html>

J'attends seulement quand Child-Of-Hello en cliquant dessus, $('div#hello').parents(target).length retournera >0.

Cependant, cela se produit chaque fois que je clique sur n'importe quel endroit.

Y a-t-il un problème avec mon code ?

171voto

user113716 Points 143363

Si vous ne vous intéressez qu'au parent direct, et pas aux autres ancêtres, vous pouvez simplement utiliser parent() et lui donner le sélecteur, comme dans target.parent('div#hello') .

Exemple : http://jsfiddle.net/6BX9n/

function fun(evt) {
    var target = $(evt.target);    
    if (target.parent('div#hello').length) {
        alert('Your clicked element is having div#hello as parent');
    }
}

Ou si vous voulez vérifier s'il y a des ancêtres qui correspondent, alors utilisez .parents() .

Exemple : http://jsfiddle.net/6BX9n/1/

function fun(evt) {
    var target = $(evt.target);    
    if (target.parents('div#hello').length) {
        alert('Your clicked element is having div#hello as parent');
    }
}

35 votes

Comment le faire sans jquery ?

72voto

Blazemonger Points 39230

.has() semble être conçu dans ce but. Puisqu'il renvoie un objet jQuery, vous devez tester la présence de .length également :

if ($('div#hello').has(target).length) {
   alert('Target is a child of #hello');
}

0 votes

@redanimalwar Exact, c'est ce que cela fait. Vous trouvez l'élément parent, puis vous vérifiez si target est à l'intérieur de celui-ci.

20voto

naitsirch Points 747

Si vous avez un élément qui n'a pas de sélecteur spécifique et que vous voulez quand même vérifier s'il est le descendant d'un autre élément, vous pouvez utiliser la méthode suivante jQuery.contains()

jQuery.contains( container, contained )
Description : Vérifie si un élément DOM est un descendant d'un autre élément DOM.

Vous pouvez passer l'élément parent et l'élément que vous voulez vérifier à cette fonction et elle renvoie si ce dernier est un descendant du premier.

3 votes

Prêtez une attention particulière à $.contains en prenant des éléments du DOM et pas Les instances de jQuery, ou il retournera toujours false.

0 votes

Un autre détail à retenir : $.contains ne retourne jamais vrai si les deux arguments sont le même élément. Si vous voulez cela, utilisez domElement.contains(domElement) .

10voto

Lukas Points 622

J'ai fini par utiliser .closest() à la place.

$(document).on("click", function (event) {
    if($(event.target).closest(".CustomControllerMainDiv").length == 1)
    alert('element is a child of the custom controller')
});

4voto

tttppp Points 999

Vous pouvez faire fonctionner votre code en échangeant simplement les deux termes :

if ($(target).parents('div#hello').length) {

Vous avez fait le tour de l'enfant et du parent dans le mauvais sens.

2 votes

var target = $(evt.target); Votre code devrait donc être le suivant if (target.parents('div#hello').length) { et non ...$(target)...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X