jquery se div id tiver filhos


202

Essa ifcondição é o que está me causando problemas:

if (div id=myfav has children) {
   do something
} else {
   do something else 
}

Eu tentei o seguinte:

if ( $('#myfav:hasChildren') ) { do something }
if ( $('#myfav').children() ) { do something }
if ( $('#myfav:empty') ) { do something }
if ( $('#myfav:not(:has(*))') ) { do something }

Respostas:


441
if ( $('#myfav').children().length > 0 ) {
     // do something
}

Isso deve funcionar. A children()função retorna um objeto JQuery que contém os filhos. Então você só precisa verificar o tamanho e ver se ele tem pelo menos um filho.


1
Obrigado pela resposta. Isto é o que funcionou para mim. Eu sabia que estava no caminho certo com os .children (), mas não sabia o que havia de errado com ele. Aparentemente, o tamanho pode ser 0, faz sentido.
— Chris

2
Se você adicionar um seletor a filhos, também poderá verificar se um elemento possui filhos que correspondem a um seletor específico, como se você deseja ver se um elemento tem um filho de uma classe específica.
— Muhd

11
questão menor. Não quero nitpick mas children().lengthdeve ser chamado em vez de tamanho () por docs jQuery aqui: api.jquery.com/size
— Brian Chavez

4
E se o nó contiver apenas texto !?
— botenvouwer

1
@sirwilliam O nó retornará com 0 comprimento.
— Meki

54

Esse trecho determinará se o elemento tem filhos usando o :parentseletor:

if ($('#myfav').is(':parent')) {
    // do something
}

Observe que :parenttambém considera um elemento com um ou mais nós de texto como pai.

Portanto, os divelementos em <div>some text</div>e <div><span>some text</span></div>serão considerados pais, mas <div></div>não são pais.


2
Sim, acho que essa resposta é mais elegante que a de S Pangborn. Ambos são completamente legítimos.
— KyleFarris 6/10/09

1
@Milo LaMar, eu suspeitaria que não há muita diferença de desempenho, mas a única maneira de ter certeza é experimentá-lo! Além disso, você precisaria remover o espaço entre #myfave :parentno seu exemplo, caso contrário, o seletor não é o mesmo que minha resposta forneceria.
— dcharles 12/01

3
Uma quantidade muito pequena de leitura respondeu o suficiente para mim. Retirado de api.jquery.com/parent-selector Additional Notes: Because :parent is a jQuery extension and not part of the CSS specification, queries using :parent cannot take advantage of the performance boost provided by the native DOM querySelectorAll() method. To achieve the best performance when using :parent to select elements, first select the elements using a pure CSS selector, then use .filter(":parent").
— Milo LaMar

6
desempenho resultados do teste em 0.002s - eu preferem esta forma, porque é melhor legível ...
— dtrunk

1
Estou confuso, essa não é a melhor resposta?
— Andrei Cristian Prodan

47

Outra opção, apenas para o inferno seria:

if ( $('#myFav > *').length > 0 ) {
     // do something
}

Na verdade, pode ser o mais rápido, pois usa estritamente o mecanismo Sizzle e não necessariamente qualquer jQuery, por assim dizer. Pode estar errado. No entanto, funciona.


16

Na verdade, existe um método nativo bastante simples para isso:

if( $('#myfav')[0].hasChildNodes() ) { ... }

Observe que isso também inclui nós de texto simples, portanto será verdadeiro para a <div>text</div>.


$(...)[0] is undefinedisso pode acontecer se #myfavnão for encontrado. Eu testar a existência do primeiro elemento combinado antes para aplicar essa condição, ou seja: $('#myfav')[0] && $('#myfav')[0].hasChildNodes().
— CPHPython

13

e se você quiser verificar div tem filhos perticulares (diga <p>use:

if ($('#myfav').children('p').length > 0) {
     // do something
}

7

Você também pode verificar se div tem filhos específicos ou não,

if($('#myDiv').has('select').length>0)
{
   // Do something here.
   console.log("you can log here");

}

4

A maneira jQuery

No jQuery, você pode usar $('#id').children().length > 0para testar se um elemento tem filhos.

Demo

var test1 = $('#test');
var test2 = $('#test2');

if(test1.children().length > 0) {
    test1.addClass('success');
} else {
    test1.addClass('failure');
}

if(test2.children().length > 0) {
    test2.addClass('success');
} else {
    test2.addClass('failure');
}
.success {
    background: #9f9;
}

.failure {
    background: #f99;
}
<script src="https://code.jquery.com/jquery-1.12.2.min.js"></script>
<div id="test">
   <span>Children</span>
</div>
<div id="test2">
   No children
</div>


O caminho da baunilha JS

Se você não quiser usar o jQuery, poderá document.getElementById('id').children.length > 0testar se um elemento tem filhos.

Demo

var test1 = document.getElementById('test');
var test2 = document.getElementById('test2');

if(test1.children.length > 0) {
    test1.classList.add('success');
} else {
    test1.classList.add('failure');
}

if(test2.children.length > 0) {
    test2.classList.add('success');
} else {
    test2.classList.add('failure');
}
.success {
    background: #9f9;
}

.failure {
    background: #f99;
}
<div id="test">
   <span>Children</span>
</div>
<div id="test2">
   No children
</div>

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.