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

时间:2010-01-29 11:43:31

标签: javascript dom

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

8 个答案:

答案 0 :(得分:165)

有两种方式:

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

hasChildNodes()函数:

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

length的{​​{1}}属性:

childNodes

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

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

这取决于children属性,该属性未在DOM1DOM2 DOM3中定义,但附近有 - 普遍的支持。 (早在2012年11月,最初编写时,它适用于IE6及以上版本以及至少的Chrome,Firefox和Opera)。如果支持旧版移动设备,请务必检查是否支持。

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

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

这取决于firstElementChild。与if (element.firstElementChild) { // It has at least one element as a child } 一样,它也没有在DOM1-3中定义,但与children不同,它直到IE9才被添加到IE中。

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

children

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

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

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

答案 1 :(得分:5)

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

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

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

 element.children.length > 0

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

Compatibility

答案 2 :(得分:2)

您可以检查元素是否具有子节点element.hasChildNodes()。请注意,在Mozilla中,如果标记后面有空格,则返回true,因此您需要验证标记类型。

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

答案 3 :(得分:2)

您还可以执行以下操作:

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

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

JSBin Demo

答案 4 :(得分:1)

迟到但文档片段可能是一个节点:

function hasChild(el){
    var child = el && el.firstChild;
    while (child) {
        if (child.nodeType === 1 || child.nodeType === 11) {
            return true;
        }
        child = child.nextSibling;
    }
    return false;
}
// or
function hasChild(el){
    for (var i = 0; el && el.childNodes[i]; i++) {
        if (el.childNodes[i].nodeType === 1 || el.childNodes[i].nodeType === 11) {
            return true;
        }
    }
    return false;
}

请参阅:
https://github.com/k-gun/so/blob/master/so.dom.js#L42
https://github.com/k-gun/so/blob/master/so.dom.js#L741

答案 5 :(得分:0)

可重复使用的isEmpty( <selector> )功能。
您也可以将它运行到元素集合(参见示例)

&#13;
&#13;
const isEmpty = sel =>
    ![... document.querySelectorAll(sel)].some(el => el.innerHTML.trim() !== "");

console.log(
  isEmpty("#one"), // false
  isEmpty("#two"), // true
  isEmpty(".foo"), // false
  isEmpty(".bar")  // true
);
&#13;
<div id="one">
 foo
</div>

<div id="two">
 
</div>

<div class="foo"></div>
<div class="foo"><p>foo</p></div>
<div class="foo"></div>

<div class="bar"></div>
<div class="bar"></div>
<div class="bar"></div>
&#13;
&#13;
&#13;

只要一个元素在空格或换行符旁边有任何类型的内容,

就会返回true(并退出循环)。

答案 6 :(得分:0)

尝试childElementCount property

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

答案 7 :(得分:-9)

<script type="text/javascript">

function uwtPBSTree_NodeChecked(treeId, nodeId, bChecked) 
{
    //debugger;
    var selectedNode = igtree_getNodeById(nodeId);
    var ParentNodes = selectedNode.getChildNodes();

    var length = ParentNodes.length;

    if (bChecked) 
    {
/*                if (length != 0) {
                    for (i = 0; i < length; i++) {
                        ParentNodes[i].setChecked(true);
                    }
    }*/
    }
    else 
    {
        if (length != 0) 
        {
            for (i = 0; i < length; i++) 
            {
                ParentNodes[i].setChecked(false);
            }
        }
    }
}
</script>

<ignav:UltraWebTree ID="uwtPBSTree" runat="server"..........>
<ClientSideEvents NodeChecked="uwtPBSTree_NodeChecked"></ClientSideEvents>
</ignav:UltraWebTree>