Мені просто довелося поділитися "моїм".
Хоча концептуально такий самий, як відповідь Асафа (вигідна однакова сумісність між браузерами, навіть 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
}