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.