其实这是一个双向判断,既可以判断某一元素是否是另一元素的子元素,也可以判断另一元素是否是某元素的父元素。这里主要介绍两种方式,一种是原生 JS 实现,一种是 HTML5 新增的原生方法。
纯 JS 实现
这里主要运用到了递归,就是不断地通过循环判断元素的父元素是否是目标元素。
function isChildNode(node, parentNode) {
// 非空判断
if (node && parentNode) {
// 如果parentNode已经是顶层,直接返回true
if (parentNode === document) {
return true;
}
// 如果 node 和 parentNode 相同,则递归结束
if (node === parentNode) {
return true;
}
// 继续递归
return isChildNode(node.parentNode, parentNode);
} else {
// 递归结束
return false
}
}
HTML5 原生方法
这是 html5新增的方法,存在兼容性问题,自行取舍。
document.contains(document.body)
// true
document.contains(document.documentElement)
// true