Saya hanya harus berbagi 'milik saya'.
Meskipun secara konseptual sama dengan jawaban Asaph (mendapat manfaat dari kompatibilitas lintas-browser yang sama, bahkan IE6), itu jauh lebih kecil dan berguna ketika ukurannya premium dan / atau ketika tidak sering dibutuhkan.
function childOf(/*child node*/c, /*parent node*/p){ //returns boolean
while((c=c.parentNode)&&c!==p);
return !!c;
}
..atau satu baris ( hanya 64 karakter !):
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
dan jsfiddle di sini .
Penggunaan:
childOf(child, parent)
mengembalikan booleantrue
| false
.
Penjelasan:
while
mengevaluasi selama kondisi sementara mengevaluasitrue
.
Operator&&
(DAN) mengembalikan boolean ini benar / salah setelah mengevaluasi sisi kiri dan sisi kanan, tetapi hanya jika sisi kiri benar ( left-hand && right-hand
) .
Sisi kiri (dari &&
) adalah: (c=c.parentNode)
.
Ini pertama-tama akan menetapkan parentNode
of c
to c
dan kemudian operator AND akan mengevaluasi hasilnya c
sebagai boolean.
Sejak parentNode
kembali null
jika tidak ada induk yang tersisa dan null
dikonversi ke false
, loop-sementara akan berhenti dengan benar ketika tidak ada lagi orangtua.
Sisi kanan (dari &&
) adalah: c!==p
.
The !==
operator perbandingan adalah ' tidak persis sama untuk'. Jadi jika orang tua anak bukan orang tua (yang Anda tentukan) dievaluasi true
, tetapi jika orang tua anak adalah orang tua maka dievaluasi untuk false
.
Jadi, jika c!==p
bernilai false, maka &&
operator kembali false
ketika kondisi-sementara dan loop-sementara berhenti. (Perhatikan bahwa tidak diperlukan tubuh sementara dan ;
titik koma penutup diperlukan.)
Jadi ketika loop-sementara berakhir, c
adalah simpul (bukan null
) ketika ia menemukan orangtua ATAU itu null
(ketika loop berlari ke ujung tanpa menemukan kecocokan).
Jadi kita hanya return
fakta (dikonversi sebagai nilai boolean, bukan node) dengan: return !!c;
: yang !
( NOT
operator) membalikkan nilai boolean ( true
menjadi false
dan sebaliknya).
!c
mengkonversi c
(node atau null) ke boolean sebelum dapat membalikkan nilai itu. Jadi menambahkan kedua !
( !!c
) mengkonversi palsu ini kembali ke true (yang mengapa ganda !!
sering digunakan untuk 'convert apapun untuk boolean').
Ekstra:
Badan / payload fungsi sangat kecil sehingga, tergantung pada kasus (seperti ketika itu tidak sering digunakan dan muncul hanya sekali dalam kode), seseorang bahkan bisa menghilangkan fungsi (membungkus) dan hanya menggunakan loop sementara:
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
}
dari pada:
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
}