如何检查元素在 Javascript 中是否有任何子元素?

IT技术 javascript dom
2021-02-12 13:04:39

简单的问题,我有一个元素,我通过.getElementById (). 我如何检查它是否有孩子?

6个回答

几种方式:

if (element.firstChild) {
    // It has at least one
}

hasChildNodes()功能:

if (element.hasChildNodes()) {
    // It has at least one
}

length财产childNodes

if (element.childNodes.length > 0) { // Or just `if (element.childNodes.length)`
    // It has at least one
}

如果您只想了解所有现代浏览器(和 IE8 — 事实上,甚至 IE6)上的元素(而不是文本节点、属性节点等),您可以这样做:(谢谢Florian!)

if (element.children.length > 0) { // Or just `if (element.children.length)`
    // It has at least one element as a child
}

这依赖于children房地产,这是不是在定义DOM1DOM2 DOM3,但其中有接近普遍支持。(它在 IE6 及更高版本以及 Chrome、Firefox 和 Opera 中工作,至少可以追溯到 2012 年 11 月,当它最初编写时。)如果支持较旧的移动设备,请务必检查支持。

如果您不需要 IE8 及更早版本的支持,您也可以这样做:

if (element.firstElementChild) {
    // It has at least one element as a child
}

那依赖于firstElementChild. 就像children,它也没有在 DOM1-3 中定义,但不像children它直到 IE9 才被添加到 IE。这同样适用于childElementCount

if (element.childElementCount !== 0) {
    // It has at least one element as a child
}

如果你想坚持 DOM1 中定义的东西(也许你必须支持真正晦涩的浏览器),你必须做更多的工作:

var hasChildElements, child;
hasChildElements = false;
for (child = element.firstChild; child; child = child.nextSibling) {
    if (child.nodeType == 1) { // 1 == Element
        hasChildElements = true;
        break;
    }
}

所有这些都是DOM1 的一部分,并且几乎得到普遍支持。

将其包装在一个函数中很容易,例如:

function hasChildElement(elm) {
    var child, rv;

    if (elm.children) {
        // Supports `children`
        rv = elm.children.length !== 0;
    } else {
        // The hard way...
        rv = false;
        for (child = element.firstChild; !rv && child; child = child.nextSibling) {
            if (child.nodeType == 1) { // 1 == Element
                rv = true;
            }
        }
    }
    return rv;
}
@Aaron:完全有可能element.firstChild是非nullwhen element.children.lengthis 0firstChild这与节点相关,包括元素、文本节点、注释注释等;children纯粹是元素孩子的列表在现代浏览器上,您可以firstElementChild改用。
2021-03-17 13:04:39
从未见过像for (child = element.firstChild; child; child = child.nextSibling ), 投票这样的循环条件谢谢 TJ
2021-03-27 13:04:39
我如何检查是否divdiv具有特定类的元素xyz
2021-04-04 13:04:39
@TysonGibby - 哇,不知道childElementCount. 查找它,请注意childElementCount只计算子元素,而不是所有子节点(就像children.length那样)。也许您试图“检测” usingfirstChild或 similar ,并且元素包含文本节点或注释节点(但不是元素)。:-)
2021-04-08 13:04:39
哦,我没有意识到children仅在DOM4中添加。知道它在任何已知浏览器中都受支持,我认为这几乎是 DOM0/1。
2021-04-09 13:04:39

正如 slashnick & bobince 所提到的,hasChildNodes()对于空白(文本节点)将返回 true。但是,我不想要这种行为,这对我有用:)

element.getElementsByTagName('*').length > 0

编辑:对于相同的功能,这是一个更好的解决方案:

 element.children.length > 0

children[]是 的子集childNodes[],仅包含元素。

兼容性

您还可以执行以下操作:

if (element.innerHTML.trim() !== '') {
    // It has at least one
} 

这使用 trim() 方法将只有空格(在这种情况下hasChildNodes返回 true)的空元素视为空元素

注意:上述方法不会过滤掉评论(所以评论会将一个孩子分类)

为了过滤掉评论,我们可以使用只读的Node.nodeType属性,其中Node.COMMENT_NODE(A Comment 节点,例如<!-- … -->) 具有常量值 - 8

if (element.firstChild?.nodeType !== 8 && element.innerHTML.trim() !== '' {
   // It has at least one
}

@VictorZamanian 好点!- 我为此添加了代码...当然,如果目的不是将文本节点和注释包含为子项,那么element.firstElementChild可能是最简单的方法:)
2021-03-30 13:04:39
这如何处理 HTML 注释?
2021-04-03 13:04:39

您可以检查元素是否有子节点element.hasChildNodes()当心在 Mozilla 中,如果标签后面是空格,这将返回 true,因此您需要验证标签类型。

https://developer.mozilla.org/En/DOM/Node.hasChildNodes

不仅仅是在 Mozilla。这是正确的行为;是 IE 出错了。
2021-03-21 13:04:39

试试childElementCount 属性

if ( element.childElementCount !== 0 ){
      alert('i have children');
} else {
      alert('no kids here');
}