Como verificar se o elemento possui algum filho em Javascript?


103

Pergunta simples, tenho um elemento que estou captando .getElementById (). Como posso verificar se tem filhos?

Respostas:


194

Algumas maneiras:

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

ou a hasChildNodes()função:

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

ou a lengthpropriedade de childNodes:

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

Se você quiser saber apenas sobre os elementos filho (em oposição aos nós de texto, nós de atributos, etc.) em todos os navegadores modernos (e IE8 - na verdade, até mesmo IE6), você pode fazer isso: (obrigado Florian !)

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

Que se baseia na childrenpropriedade, que não foi definido no DOM1 , DOM2 , ou DOM3 , mas que tem apoio quase universal. (Funciona no IE6 e superior e Chrome, Firefox e Opera pelo menos desde novembro de 2012, quando foi originalmente escrito.) Se for compatível com dispositivos móveis mais antigos, certifique-se de verificar o suporte.

Se você não precisa do IE8 e do suporte anterior, também pode fazer o seguinte:

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

Isso depende firstElementChild. Por exemplo children, também não foi definido no DOM1-3, mas, ao contrário children, não foi adicionado ao IE até o IE9.

Se você quiser manter algo definido em DOM1 (talvez tenha que oferecer suporte a navegadores realmente obscuros), você terá que trabalhar mais:

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

Tudo isso faz parte do DOM1 e tem suporte quase universal.

Seria fácil resumir isso em uma função, por exemplo:

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;
}

Ah, não sabia que childrensó foi adicionado no DOM4. Sabendo que era compatível com qualquer navegador conhecido, achei que era praticamente DOM0 / 1.
— Florian Margaine

como faço para verificar se algum divtem elemento divcom classe específica dizer xyz?
— Pooja Desai

firstChild e hasChildNodes retornam qualquer nó, não apenas filhos (nodeType == 1). Você deve corrigir isso. ;-)
— Adrian Maire

1
Nunca vi uma condição de loop como for (child = element.firstChild; child; child = child.nextSibling ), votou. Obrigado TJ
— NiCk Newman

2
@Aaron: É inteiramente possível element.firstChildnão ser nullquando element.children.lengthé 0: firstChilde está relacionado a nós, incluindo elementos, nós de texto, notas de comentários, etc .; childrené puramente uma lista de filhos de elementos . Em navegadores modernos, você pode usar firstElementChild.
— TJ Crowder

8

Como slashnick & bobince menciona, hasChildNodes()retornará true para espaços em branco (nós de texto). No entanto, eu não queria esse comportamento e funcionou para mim :)

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

Editar : para a mesma funcionalidade, esta é uma solução melhor:

 element.children.length > 0

children[]é um subconjunto de childNodes[], contendo apenas elementos.

Compatibilidade



2

Você também pode fazer o seguinte:

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

Isso usa o método trim () para tratar os elementos vazios que têm apenas espaços em branco (nesse caso, hasChildNodesretorna verdadeiro) como sendo vazios.

JSBin Demo


Como isso se comporta com comentários HTML?
— Victor Zamanian

1

Atrasado, mas o fragmento do documento pode ser um nó:

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;
}

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



0

Uma isEmpty( <selector> )função reutilizável .
Você também pode executá-lo em uma coleção de elementos (veja o exemplo)

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
);
<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>

retorna true(e sai do loop) assim que um elemento tiver qualquer tipo de conteúdo além de espaços ou novas linhas.


-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>

Não forneça apenas soluções apenas de código. Além disso, por que você comentou o código lá?
— Lee Taylor

Downvote: Este código é obscuro, parte do código não é necessária, não há comentários ou explicação e parece uma cópia / passado. Além disso, a parte XML não tem nada a ver aqui.
— Adrian Maire

2
O que é essa loucura?
— NiCk Newman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.