Solo tenía que compartir 'el mío'.
Aunque conceptualmente es lo mismo que la respuesta de Asaph (que se beneficia de la misma compatibilidad entre navegadores, incluso IE6), es mucho más pequeño y resulta útil cuando el tamaño es muy alto y / o cuando no se necesita con tanta frecuencia.
function childOf(/*child node*/c, /*parent node*/p){ //returns boolean
while((c=c.parentNode)&&c!==p);
return !!c;
}
..o como una línea (¡ solo 64 caracteres !):
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
y jsfiddle aquí .
Uso:
childOf(child, parent)
devuelve booleanotrue
| false
.
Explicación: se
while
evalúa siempre que la condición while se evalúe comotrue
.
El&&
operador (AND) devuelve este booleano verdadero / falso después de evaluar el lado izquierdo y el lado derecho, pero solo si el lado izquierdo era verdadero ( left-hand && right-hand
) .
El lado izquierdo (de &&
) es: (c=c.parentNode)
.
Esto asignará primero el parentNode
de c
a c
y luego el operador AND evaluará el resultado c
como un booleano.
Como parentNode
regresa null
si no queda ningún padre y null
se convierte a false
, el ciclo while se detendrá correctamente cuando no haya más padres.
El lado derecho (de &&
) es: c!==p
.
El !==
operador de comparación ' no es exactamente igual a'. Entonces, si el padre del niño no es el padre (usted especificó) se evalúa true
, pero si el padre del niño es el padre, entonces se evalúa false
.
Entonces, si se c!==p
evalúa como falso, el &&
operador regresa false
como la condición while y el ciclo while se detiene. (Tenga en cuenta que no es necesario un cuerpo de tiempo y ;
se requiere el punto y coma de cierre )
Entonces, cuando finaliza el ciclo while, c
es un nodo (no null
) cuando encuentra un padre O lo es null
(cuando el ciclo se ejecuta hasta el final sin encontrar una coincidencia).
Por lo tanto, simplemente return
ese hecho (convertido como valor booleano, en lugar del nodo) con return !!c;
:: el !
( NOT
operador) invierte un valor booleano (se true
convierte false
y viceversa).
!c
convierte c
(nodo o nulo) a un valor booleano antes de que pueda invertir ese valor. Entonces, agregar un segundo !
( !!c
) convierte este falso de nuevo en verdadero (razón por la cual un doble!!
menudo se usa para 'convertir cualquier cosa a booleano').
Extra:
El cuerpo / carga útil de la función es tan pequeña que, dependiendo del caso (como cuando no se usa con frecuencia y aparece solo una vez en el código), uno podría incluso se omitir la función (ajuste) y solo usar el ciclo 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
}
en vez 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
}