Como verifico se um elemento HTML está vazio usando o jQuery?


336

Estou tentando chamar uma função apenas se um elemento HTML estiver vazio, usando jQuery.

Algo assim:

if (isEmpty($('#element'))) {
    // do something
}

$('#elem').text().match(/\S/) || alert('empty');
Thielicious

Respostas:


557
if ($('#element').is(':empty')){
  //do something
}

para obter mais informações, consulte http://api.jquery.com/is/ e http://api.jquery.com/empty-selector/

EDITAR:

Como alguns apontaram, a interpretação do navegador de um elemento vazio pode variar. Se você deseja ignorar elementos invisíveis, como espaços e quebras de linha, e tornar a implementação mais consistente, é possível criar uma função (ou apenas usar o código dentro dela).

  function isEmpty( el ){
      return !$.trim(el.html())
  }
  if (isEmpty($('#element'))) {
      // do something
  }

Você também pode transformá-lo em um plug-in jQuery, mas você entendeu.


56
Quebras de linha são consideradas conteúdo para elementos no FF e Chrome.
Corneliu

@Corneliu está correto. Eu postei uma resposta abaixo que leva isso em consideração. Esta foi uma grande fonte de frustração para mim em um projeto recente
DMTintner

2
Esta é :-D brilhante
jasonbradberry

Comentários em HTML também são considerados conteúdo.
Paolo

Fazer isso com uma função é bom, é claro, mas se você quiser mais "incorporado" (e um pouco desafiador), eu recomendaria manipular o protótipo do jQuery ou usar a excelente função da função "filtro" do JQ ...
TheCuBeMan

117

Achei essa a única maneira confiável (já que o Chrome e o FF consideram espaços em branco e quebras de linha como elementos):

if($.trim($("selector").html())=='')

20
Uma versão ligeiramente mais comprimido pode tirar proveito de Falsas-ness da cadeia vazia: if(!$.trim($("selector").html())
Brandon Belvin

11
Não acho que eles os considerem "elementos", mas os consideram nós, o que é IMO correto. Você também pode fazer if($("selector").children().length === 0)ou if($("selector > *").length === 0).
Panzi 13/05

11
Eu acho que você está confundindo "elementos" com "nós".

11
$ ("selector"). html (). trim () === ''
user1156544

11
Não sei por que, mas o método desta resposta: if ($. Trim ($ ("selector")). Html ()) == '') funcionou. .is (': vazio') não!
Zeljko Miloradovic

62

Espaço em branco e quebras de linha são os principais problemas do uso de: seletor vazio. Cuidado, em CSS, a pseudo classe: empty se comporta da mesma maneira. Eu gosto deste método:

if ($someElement.children().length == 0){
     someAction();
}

4
Eu escolhi isso acima porque tinha comentários em HTML no meu DIV.
Paolo

2
De longe a solução mais elegante, deve ser a resposta correta.
Christoffer Bubach 22/09/2015

6
Observe que $.children()não retorna nós de texto ou comentário, o que significa que esta solução apenas verifica se o elemento está vazio de elementos . Se um elemento que contém apenas texto ou comentários não deve ser considerado vazio para suas necessidades, você deve usar uma das outras soluções.
precisa saber é o seguinte

@sierrasdetandil para selectelementos é perfeito. a condição também pode ser if(! $el.children().length).
precisa saber é o seguinte

28
!elt.hasChildNodes()

Sim, eu sei, isso não é jQuery, então você pode usar isso:

!$(elt)[0].hasChildNodes()

Feliz agora?


11
+1 Usei sua abordagem dentro de uma filterfunção jQuery , pois não queria usar o jQuery dentro da função, a menos que necessário.
WynandB

11
Se considerar apenas espaço em branco vazio <div class="results"> </div>, esta declaração retornará false. jsfiddle.net/ytliuSVN/0pdwLt46
Penny Liu

19
jQuery.fn.doSomething = function() {
   //return something with 'this'
};

$('selector:empty').doSomething();

Ótimo! Gosto de construções sem ifs.
Nikolay Fominyh

concordo totalmente com @Nikolay, não é útil para a minha situação específica, mas lembrarei no futuro!
vitto

bem, isso não iria funcionar quando você tem que aplicar 'isto'
Zelo Murapa

O que mais haveria thisalém do elemento jQuery @ZealMurapa?
AlienWebguy

12

Se por "vazio", você quer dizer sem conteúdo HTML,

if($('#element').html() == "") {
  //call function
}

cuidado, espaços em branco e quebras de linha podem fazer com que o html não == '', mas o elemento ainda esteja vazio. Verifique minha resposta abaixo para outra solução
DMTintner 28/08/2013

8

Vazio como em não contém texto?

if (!$('#element').text().length) {
    ...
}

Isso não aborda elementos cujo conteúdo é imagens (não pergunte como eu criei isso ...) #
493 Bad Request

@BadRequest Não, portanto, o ponto de interrogação após "como em não contém texto ?" :)
jensgram

7

Em resumo, existem muitas opções para descobrir se um elemento está vazio:

1- Usando html:

if (!$.trim($('p#element').html())) {
    // paragraph with id="element" is empty, your code goes here
}

2- Usando text:

if (!$.trim($('p#element').text())) {
    // paragraph with id="element" is empty, your code goes here
}

3- Usando is(':empty'):

if ($('p#element').is(':empty')) {
    // paragraph with id="element" is empty, your code goes here
}

4- Usando length

if (!$('p#element').length){
    // paragraph with id="element" is empty, your code goes here
}

Além disso, se você está tentando descobrir se um elemento de entrada está vazio, pode usar val:

if (!$.trim($('input#element').val())) {
    // input with id="element" is empty, your code goes here
}

2

Outra opção que deve exigir menos "trabalho" para o navegador que html()ou children():

function isEmpty( el ){
  return !el.has('*').length;
}

1
document.getElementById("id").innerHTML == "" || null

ou

$("element").html() == "" || null

0

Podes tentar:

if($('selector').html().toString().replace(/ /g,'') == "") {
//code here
}

* Substitua espaços em branco, apenas no caso de;)


Não iria !/[\S]/.test($('Selector').html())funcionar melhor, uma vez que você encontrar algum espaço em branco que você sabe que não está vazia
qwertymk

Por que o / i nos sinalizadores de regex? Existem versões em maiúsculas e minúsculas do caractere de espaço?
Alexis Wilke

obrigado, atualizei minha resposta. Eu não tenho idéia por que eu ter adicionado / i
Marc Uberstein

11
@RobertMallow, Talvez o regex suporte \ S, no entanto, o Unicode define espaços em branco como Cc, Zs, Zl, Zp conforme mostrado aqui: unicode.org/Public/UNIDATA/PropList.txt - maiúsculas e minúsculas ...
Alexis Wilke

11
@RobertMallow, também The production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s.a partir ecma-international.org/ecma-262/5.1/#sec-15.10.2.12
Alexis Wilke

-1
if($("#element").html() === "")
{

}



-1

Javascript

var el= document.querySelector('body'); 
console.log(el);
console.log('Empty : '+ isEmptyTag(el));
console.log('Having Children : '+ hasChildren(el));


function isEmptyTag(tag) { 
    return (tag.innerHTML.trim() === '') ? true : false ;
}
function hasChildren(tag) {
    //return (tag.childElementCount !== 0) ? true : false ; // Not For IE
    //return (tag.childNodes.length !== 0) ? true : false ; // Including Comments
    return (tag.children.length !== 0) ? true : false ; // Only Elements
}

tente usar isso!

document.getElementsByTagName('div')[0];
document.getElementsByClassName('topbar')[0];

document.querySelectorAll('div')[0];
document.querySelector('div'); // gets the first element.

-1

Tente o seguinte:

if (!$('#el').html()) {
    ...
}

-2

Quebras de linha são consideradas como conteúdo para elementos no FF.

<div>
</div>
<div></div>

Ex:

$("div:empty").text("Empty").css('background', '#ff0000');

No IE, os dois divs são considerados vazios; no FF, no Chrome, apenas o último está vazio.

Você pode usar a solução fornecida por @qwertymk

if(!/[\S]/.test($('#element').html())) { // for one element
    alert('empty');
}

ou

$('.elements').each(function(){  // for many elements
    if(!/[\S]/.test($(this).html())) { 
        // is empty
    }
})
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.