Je devais juste partager le «mien».
Bien que conceptuellement identique à la réponse d'Asaph (bénéficiant de la même compatibilité entre les navigateurs, même IE6), il est beaucoup plus petit et s'avère pratique lorsque la taille est limitée et / ou lorsqu'elle n'est pas nécessaire si souvent.
function childOf(/*child node*/c, /*parent node*/p){ //returns boolean
while((c=c.parentNode)&&c!==p);
return !!c;
}
..ou en une ligne ( 64 caractères seulement !):
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
et jsfiddle ici .
Utilisation:
childOf(child, parent)
retourne booléentrue
| false
.
Explication:
while
évalue tant que la condition while est évaluéetrue
.
L'&&
opérateur (AND) renvoie ce booléen true / false après avoir évalué le côté gauche et le côté droit, mais uniquement si le côté gauche était vrai ( left-hand && right-hand
) .
Le côté gauche (de &&
) est: (c=c.parentNode)
.
Cela affectera d'abord le parentNode
of c
à c
puis l'opérateur AND évaluera le résultat c
comme un booléen.
Puisque parentNode
renvoie null
s'il n'y a plus de parent et null
est converti en false
, la boucle while s'arrêtera correctement lorsqu'il n'y aura plus de parents.
Le côté droit (de &&
) est: c!==p
.
L' !==
opérateur de comparaison n'est « pas exactement égal à». Donc, si le parent de l'enfant n'est pas le parent (vous avez spécifié), il évalue true
, mais si le parent de l'enfant est le parent, il évalue false
.
Donc, si la valeur est c!==p
false, l' &&
opérateur retourne false
comme condition while et la boucle while s'arrête. (Notez qu'il n'est pas nécessaire d'avoir un corps-tout et que le ;
point-virgule de fermeture est requis.)
Ainsi, lorsque la boucle while se termine, c
est soit un nœud (pas null
) lorsqu'il a trouvé un parent OU il l'est null
(lorsque la boucle a parcouru jusqu'à la fin sans trouver de correspondance).
Ainsi , nous avons simplement return
ce fait (converti en valeur booléenne, au lieu du nœud) avec: return !!c;
: le !
( NOT
opérateur) Inverse une valeur booléenne ( true
devient false
et vice-versa).
!c
convertit c
(nœud ou null) en booléen avant de pouvoir inverser cette valeur. Ainsi , l' ajout d' une seconde !
( !!c
) convertit ce faux retour à vrai ( ce qui est la raison pour laquelle un double !!
est souvent utilisé pour "quoi que ce soit converti en booléen).
Extra:
le corps / la charge utile de la fonction est si petit que, selon le cas (comme quand il n'est pas souvent utilisé et n'apparaît qu'une seule fois dans le code), on pourrait même omettre la fonction (habillage) et utiliser simplement la boucle while:
var a=document.getElementById('child'),
b=document.getElementById('parent'),
c;
c=a; while((c=c.parentNode)&&c!==b); //c=!!c;
if(!!c){ //`if(c)` if `c=!!c;` was used after while-loop above
//do stuff
}
au lieu de:
var a=document.getElementById('child'),
b=document.getElementById('parent'),
c;
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
c=childOf(a, b);
if(c){
//do stuff
}