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

Dav*_*vid 95 javascript dom

简单的问题,我有一个我正在抓住的元素.getElementById ().如何检查是否有孩子?

T.J*_*der 175

有两种方法:

if (element.firstChild) {
    // It has at least one
}
Run Code Online (Sandbox Code Playgroud)

hasChildNodes()功能:

if (element.hasChildNodes()) {
    // It has at least one
}
Run Code Online (Sandbox Code Playgroud)

或以下length财产childNodes:

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

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

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

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

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

if (element.firstElementChild) {
    // It has at least one element as a child
}
Run Code Online (Sandbox Code Playgroud)

这取决于firstElementChild.就像children,它也没有在DOM1-3中定义,但不像children它直到IE9才被添加到IE中.

如果你想坚持DOM1中定义的东西(也许你必须支持非常模糊的浏览器),你必须做更多的工作:

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

所有这些都是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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Aaron:当`element.children.length`为'0`时,`element.firstChild`完全有可能是非`null`:`firstChild`,这与*nodes*有关,包括元素,文本节点,注释注释等等; `children`纯粹是*element*children的列表.在现代浏览器中,您可以使用`firstElementChild`代替. (2认同)

Dan*_*eld 7

您还可以执行以下操作:

if (element.innerHTML.trim() !== '') {
    // It has at least one
} 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


sla*_*ick 6

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

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

  • 不仅仅是在 Mozilla。这是正确的行为;是 IE 出错了。 (7认同)

c24*_*24w 5

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

element.getElementsByTagName('*').length > 0
Run Code Online (Sandbox Code Playgroud)

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

 element.children.length > 0
Run Code Online (Sandbox Code Playgroud)

children[]childNodes[]仅包含元素的子集.

兼容性


小智 5

尝试childElementCount 属性

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