Sadece benimkini paylaşmak zorunda kaldım.
Kavramsal olarak Asaph'ın cevabı ile aynı olsa da (aynı tarayıcılar arası uyumluluktan, hatta IE6'dan yararlanarak), çok daha küçüktür ve boyut premium olduğunda ve / veya çok sık ihtiyaç duyulmadığında kullanışlı olur.
function childOf(/*child node*/c, /*parent node*/p){ //returns boolean
while((c=c.parentNode)&&c!==p);
return !!c;
}
..ya da tek astar olarak ( sadece 64 karakter !):
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
ve burada jsfiddle .
Kullanım:
childOf(child, parent)
boolean döndürürtrue
| false
.
Açıklama:
while
while koşulu değerlendirildiği sürece değerlendirirtrue
. (AND) operatörü döner bu boole doğru / yanlış sonra sol tarafını ve sağ tarafını değerlendirirken, fakat sadece eğer sol taraftaki doğruydu ( ) .
&&
left-hand && right-hand
(Sol taraftaki &&
) aşağıdaki gibidir: (c=c.parentNode)
.
Bu, ilk atar parentNode
ait c
etmek c
ve daha sonra VE operatör çıkan değerlendirecek c
boolean olarak.
Yana parentNode
getiri null
hiçbir ebeveyn sol varsa ve null
dönüştürülür false
artık anne varken iken döngü doğru duracak.
(Sağ taraftaki &&
) aşağıdaki gibidir: c!==p
. Karşılaştırma operatörü 'dir değil tam karşı eşit'. Çocuğun ebeveyn ana (belirttiğiniz) o olarak değerlendirilir değildir Yani eğer , ancak çocuğun ebeveyn eğer olduğunu ebeveyn o zaman olarak değerlendirilirse .
Dolayısıyla, eğer false olarak değerlendirilirse, operatör while koşulu olarak döner ve while döngüsü durur. (Bir süre gövdesine gerek olmadığını ve kapanış noktalı virgülünün gerekli olduğunu unutmayın.)
!==
true
false
c!==p
&&
false
;
Bu yüzden while döngüsü sona erdiğinde, bir üst öğe VEYA bulduğunda c
bir düğümdür (değil null
) null
(döngü eşleşme bulmadan sonuna kadar koştuğunda).
Bu nedenle sadece biz return
ile (yerine düğümün, mantıksal bir değer olarak dönüştürülmüş) aslında: return !!c;
: !
( NOT
operatörü) bir Boole değeri (ters çevirir true
olur false
ve tam tersi).
!c
dönüştürür c
bir mantıksal değere (düğüm veya boş) bu değer tersine önce. Yani bir ikinci !
( !!c
) eklemek bu yanlışı tekrar doğruya dönüştürür (bu yüzden bir çift !!
genellikle 'herhangi bir şeyi boole'ye dönüştürmek için kullanılır).
Ekstra:
işlevin vücut / yük çok küçük, bu durumda bağlı bir (genellikle kullanılan ve kod sadece bir kez görünür değilken gibi) olabilir fonksiyonunu (sarma) ihmal ve sadece while-döngü kullansalar bile:
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
}
onun yerine:
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
}