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
}
vitto
fonte
$('#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.

Emil
fonte
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())=='')
Serge Shultz
fonte
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();
}
DMTintner
fonte
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?


fonte
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();
AlienWebguy
fonte
Ó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
}
Digital Plane
fonte
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) {
    ...
}
jensgram
fonte
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
}
RuiVBoas
fonte
2

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

function isEmpty( el ){
  return !el.has('*').length;
}
dahlbyk
fonte
1
document.getElementById("id").innerHTML == "" || null

ou

$("element").html() == "" || null
MayorMonty
fonte
0

Podes tentar:

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

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

Marc Uberstein
fonte
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() === "")
{

}
Alex
fonte
-1

Aqui está um filtro jQuery baseado em https://stackoverflow.com/a/6813294/698289

$.extend($.expr[':'], {
  trimmedEmpty: function(el) {
    return !$.trim($(el).html());
  }
});
DanH
fonte
-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.
Yash
fonte
-1

Tente o seguinte:

if (!$('#el').html()) {
    ...
}
Syed
fonte
-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
    }
})
Corneliu
fonte