Tôi chỉ phải chia sẻ 'của tôi'.
Mặc dù về mặt khái niệm giống như câu trả lời của Asaph (được hưởng lợi từ cùng khả năng tương thích trình duyệt chéo, thậm chí IE6), nó nhỏ hơn rất nhiều và có ích khi kích thước ở mức cao và / hoặc khi không cần thiết thường xuyên.
function childOf(/*child node*/c, /*parent node*/p){ //returns boolean
while((c=c.parentNode)&&c!==p);
return !!c;
}
.. hoặc là một lớp lót ( chỉ 64 ký tự !):
function childOf(c,p){while((c=c.parentNode)&&c!==p);return !!c}
và jsfiddle ở đây .
Cách sử dụng:
childOf(child, parent)
trả về booleantrue
| false
.
Giải thích:
while
đánh giá miễn là điều kiện while đánh giátrue
.
Các&&
(AND) khai thác lợi nhuận boolean true / false này sau khi đánh giá tình hình bên trái tay và phía bên tay phải, nhưng chỉ nếu phía bên trái tay là sự thật ( left-hand && right-hand
) .
Phía bên trái (của &&
) là : (c=c.parentNode)
.
Đây đầu tiên sẽ giao parentNode
của c
để c
rồi AND điều hành sẽ đánh giá kết quả c
như một boolean.
Vì parentNode
trả về null
nếu không còn cha mẹ và null
được chuyển đổi thành false
, vòng lặp while sẽ dừng chính xác khi không còn cha mẹ nữa.
Phía bên tay phải (của &&
) là : c!==p
.
Các !==
toán tử so sánh là ' không chính xác bằng'. Vì vậy, nếu cha mẹ của đứa trẻ không phải là cha mẹ (bạn đã chỉ định) thì nó ước tính true
, nhưng nếu cha mẹ của đứa trẻ là cha mẹ thì nó sẽ đánh giá false
.
Vì vậy, nếu c!==p
đánh giá thành false, thì &&
toán tử trả về false
khi điều kiện while và vòng lặp while dừng lại. (Lưu ý không cần thiết trong một thời gian và đóng cửa;
dấu chấm phẩy là bắt buộc.)
Vì vậy, khi vòng lặp while kết thúc, c
là một nút (không phải null
) khi nó tìm thấy cha mẹ HOẶC nó lànull
(khi vòng lặp chạy đến hết mà không tìm thấy kết quả khớp).
Vì vậy chúng tôi chỉ đơn giản return
là thực tế (quy đổi như giá trị boolean, thay vì nút) với: return !!c;
: các !
( NOT
nhà điều hành) sẽ đảo ngược một giá trị boolean ( true
trở thành false
và ngược lại).
!c
chuyển đổi c
(nút hoặc null) thành boolean trước khi nó có thể đảo ngược giá trị đó. Vì vậy, thêm một giây !
( !!c
) chuyển đổi sai này lại là true (đó là lý do tại sao một đôi !!
thường được dùng để 'chuyển đổi bất cứ điều gì để boolean').
Bổ sung:
Phần thân / tải trọng của hàm nhỏ đến mức, tùy theo trường hợp (như khi nó không được sử dụng thường xuyên và chỉ xuất hiện một lần trong mã), người ta thậm chí có thể bỏ qua hàm (gói) và chỉ sử dụng vòng lặp 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
}
thay vì:
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
}