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 parentNodeait cetmek cve daha sonra VE operatör çıkan değerlendirecek cboolean olarak.
Yana parentNodegetiri nullhiçbir ebeveyn sol varsa ve nulldönüştürülür falseartı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.)
!==truefalse
c!==p&&false;
Bu yüzden while döngüsü sona erdiğinde, bir üst öğe VEYA bulduğunda cbir düğümdür (değil null) null(döngü eşleşme bulmadan sonuna kadar koştuğunda).
Bu nedenle sadece biz returnile (yerine düğümün, mantıksal bir değer olarak dönüştürülmüş) aslında: return !!c;: !( NOToperatörü) bir Boole değeri (ters çevirir trueolur falseve tam tersi).
!cdönüştürür cbir 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
}