Мені просто довелося поділитися "моїм".
Хоча концептуально такий самий, як відповідь Асафа (вигідна однакова сумісність між браузерами, навіть IE6), він набагато менший і корисний, коли розмір є преміальним та / або коли він не потрібен так часто.
function childOf(/*child node*/c, /*parent node*/p){ //returns boolean
while((c=c.parentNode)&&c!==p);
return !!c;
}
.. або як однолінійний ( всього 64 символи !):
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
і jsfiddle тут .
Використання:
childOf(child, parent)
повертає булеваtrue
| false
.
Пояснення:
while
оцінюється до тих пір, поки оцінюється умова whiletrue
.
Оператор&&
(AND) повертає булеве значення true / false після оцінки лівої та правої частини, але лише в тому випадку, якщо лівий бік був істинним ( left-hand && right-hand
) .
Ліва сторона (з &&
) має вигляд : (c=c.parentNode)
.
Це перший буде призначити parentNode
з c
до , c
а потім оператор І буде оцінювати отриманий c
як логічне значення.
Оскільки parentNode
повертається, null
якщо не залишилося жодного з батьків, і null
перетворюється на нього false
, цикл while буде правильно зупинятися, коли немає більше батьків.
Права (з &&
) має вигляд : c!==p
.
Оператор !==
порівняння " не зовсім дорівнює". Отже, якщо батько дитини не є батьком (ви вказали), який він оцінює true
, але якщо батько дитини є батьком, то він оцінює false
.
Отже, якщо c!==p
оцінюється як false, тоді &&
оператор повертається false
як умова while, а цикл while припиняється. (Зверніть увагу, що немає необхідності в тілі "час", і ;
крапка з комою потрібна.)
Отже, коли цикл while закінчується, c
це або вузол (не null
), коли він знайшов батьківський АБО він є null
(коли цикл пробіг до кінця, не знайшовши відповідності).
Таким чином , ми просто return
той факт (конвертується в логічне значення, замість вузла) з: return !!c;
: від !
( NOT
оператор) інвертує логічне значення ( true
стає false
і навпаки).
!c
перетворює c
(вузол або нуль) в булеве значення, перш ніж воно зможе інвертувати це значення. Тож додавання секунди !
( !!c
) перетворює цю помилкову назад у справжню (саме тому подвійний !!
часто використовується для 'перетворення будь-чого на булевий').
Додатково:
Тіло / корисне навантаження функції настільки мало, що залежно від випадку (наприклад, коли воно не використовується часто і з’являється лише один раз у коді), можна навіть опустити функцію (обгортання) та просто використовувати цикл 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
}
замість:
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
}