Ich musste nur 'meine' teilen.
Obwohl es konzeptionell mit der Antwort von Asaph identisch ist (mit der gleichen browserübergreifenden Kompatibilität, sogar mit IE6), ist es viel kleiner und praktisch, wenn die Größe knapp ist und / oder wenn es nicht so oft benötigt wird.
function childOf(/*child node*/c, /*parent node*/p){ //returns boolean
while((c=c.parentNode)&&c!==p);
return !!c;
}
..oder als Einzeiler ( nur 64 Zeichen !):
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
und jsfiddle hier .
Verwendung:
childOf(child, parent)
Gibt booleantrue
| zurück false
.
Erläuterung: Wird
while
ausgewertet, solange die while-Bedingung ausgewertet wirdtrue
.
Der&&
Operator (AND) gibt diesen booleschen Wert true / false zurück, nachdem die linke und die rechte Seite ausgewertet wurden, jedoch nur, wenn die linke Seite true ( left-hand && right-hand
) war. .
Die linke Seite (von &&
) ist : (c=c.parentNode)
.
Dadurch wird zuerst das parentNode
von c
bis zugewiesen , c
und dann bewertet der AND-Operator das Ergebnis c
als Booleschen Wert.
Da parentNode
zurückgegeben wird, null
wenn kein übergeordnetes Element mehr vorhanden ist und in null
das konvertiert wird, false
wird die while-Schleife korrekt gestoppt, wenn keine übergeordneten Elemente mehr vorhanden sind.
Die rechte Seite (von &&
) ist : c!==p
.
Der !==
Vergleichsoperator ist ' nicht genau gleich'. Wenn also das Elternteil des Kindes nicht das Elternteil ist (das Sie angegeben haben), wird es ausgewertet true
, aber wenn das Elternteil des Kindes das Elternteil ist, wird es ausgewertet false
.
Also , wenn c!==p
das Ergebnis falsch, dann werden die &&
Bediener kehrt false
als while-Zustand und die while-Schleife beendet. (Beachten Sie, dass ein while-body und das Schließen nicht erforderlich sind;
erforderlich ist Semikolon erforderlich ist.)
Wenn die while-Schleife endet, c
ist sie entweder ein Knoten (nicht null
), wenn sie ein übergeordnetes Element gefunden hat, oder sie ist esnull
(wenn die Schleife bis zum Ende durchgegangen ist, ohne eine Übereinstimmung zu finden).
Also einfach return
diese Tatsache (konvertiert als boolescher Wert anstelle des Knotens) mit :: return !!c;
der !
( NOT
Operator) invertiert einen booleschen Wert ( true
wird false
und umgekehrt).
!c
konvertiert c
(Knoten oder Null) in einen Booleschen Wert, bevor dieser Wert invertiert werden kann. Wenn Sie also ein second !
( !!c
) hinzufügen, wird dieses false wieder in true konvertiert (weshalb ein Double !!
häufig verwendet wird, um "alles in Boolesche Werte umzuwandeln").
Extra:
Die Körper / Nutzlast - Funktion ist so klein , dass im Fall abhängig (wie wenn es nicht oft verwendet wird , und erscheint nur einmal im Code), einer konnte sogar die Funktion (Verpackung) auslassen und benutzen Sie einfach die while-Schleife:
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
}
anstatt:
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
}