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 parentNodeof cto cdan kemudian operator AND akan mengevaluasi hasilnya csebagai boolean.
Sejak parentNodekembali nulljika tidak ada induk yang tersisa dan nulldikonversi 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 falseketika kondisi-sementara dan loop-sementara berhenti. (Perhatikan bahwa tidak diperlukan tubuh sementara dan ;titik koma penutup diperlukan.)
Jadi ketika loop-sementara berakhir, cadalah simpul (bukan null) ketika ia menemukan orangtua ATAU itu null(ketika loop berlari ke ujung tanpa menemukan kecocokan).
Jadi kita hanya returnfakta (dikonversi sebagai nilai boolean, bukan node) dengan: return !!c;: yang !( NOToperator) membalikkan nilai boolean ( truemenjadi falsedan sebaliknya).
!cmengkonversi 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
}