Pergunta simples, tenho um elemento que estou captando .getElementById ()
. Como posso verificar se tem filhos?
fonte
Pergunta simples, tenho um elemento que estou captando .getElementById ()
. Como posso verificar se tem filhos?
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 length
propriedade 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 children
propriedade, 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;
}
children
só foi adicionado no DOM4. Sabendo que era compatível com qualquer navegador conhecido, achei que era praticamente DOM0 / 1.div
tem elementodiv
com classe específica dizerxyz
?for (child = element.firstChild; child; child = child.nextSibling )
, votou. Obrigado TJelement.firstChild
não sernull
quandoelement.children.length
é0
:firstChild
e 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 usarfirstElementChild
.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 :)Editar : para a mesma funcionalidade, esta é uma solução melhor:
children[]
é um subconjunto dechildNodes[]
, contendo apenas elementos.Compatibilidade
fonte
Você pode verificar se o elemento tem nós filhos
element.hasChildNodes()
. Cuidado no Mozilla, isso retornará verdadeiro se houver um espaço em branco após a tag, então você precisará verificar o tipo de tag.https://developer.mozilla.org/En/DOM/Node.hasChildNodes
fonte
Você também pode fazer o seguinte:
Isso usa o método trim () para tratar os elementos vazios que têm apenas espaços em branco (nesse caso,
hasChildNodes
retorna verdadeiro) como sendo vazios.JSBin Demo
fonte
Atrasado, mas o fragmento do documento pode ser um nó:
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
fonte
Experimente a propriedade childElementCount :
fonte
Uma
isEmpty( <selector> )
função reutilizável .Você também pode executá-lo em uma coleção de elementos (veja o exemplo)
retorna
true
(e sai do loop) assim que um elemento tiver qualquer tipo de conteúdo além de espaços ou novas linhas.fonte
fonte