¿Cómo verifico si un elemento HTML está vacío usando jQuery?

336

Estoy tratando de llamar a una función solo si un elemento HTML está vacío, usando jQuery.

Algo como esto:

if (isEmpty($('#element'))) {
    // do something
}
vitto
fuente
$('#elem').text().match(/\S/) || alert('empty');
Thielicious

Respuestas:

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

Para obtener más información, visite http://api.jquery.com/is/ y http://api.jquery.com/empty-selector/

EDITAR:

Como algunos han señalado, la interpretación del navegador de un elemento vacío puede variar. Si desea ignorar elementos invisibles como espacios y saltos de línea y hacer que la implementación sea más consistente, puede crear una función (o simplemente usar el código dentro de ella).

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

También puede convertirlo en un complemento jQuery, pero se entiende la idea.

Emil
fuente
56
Los saltos de línea se consideran contenido para elementos en FF y Chrome.
Corneliu
@ Corneliu es correcto. Publiqué una respuesta a continuación que lo toma en consideración. Esta fue una gran fuente de frustración para mí en un proyecto reciente
DMTintner
2
Esto es brillante :-D
jasonbradberry
Los comentarios HTML también se consideran contenido.
Paolo
Hacer esto con una función es bueno, por supuesto, pero si lo quieres más "incrustado" (y un poco desafiante), recomendaría manipular el prototipo de jQuery o usar la gran capacidad de función de "filtro" de JQ ...
TheCuBeMan
117

Encontré que esta es la única forma confiable (ya que Chrome y FF consideran los espacios en blanco y los saltos de línea como elementos):

if($.trim($("selector").html())=='')
Serge Shultz
fuente
20
Una versión un poco más comprimida puede aprovechar la falsedad de la cadena vacía: if(!$.trim($("selector").html())
Brandon Belvin
11
No creo que los consideren "elementos", pero los consideran nodos, lo cual es IMO correcto. También puedes hacer if($("selector").children().length === 0)o if($("selector > *").length === 0).
panzi
1
Creo que estás confundiendo "elementos" con "nodos".
1
$ ("selector"). html (). trim () === ''
usuario1156544
1
No sé por qué, pero el método de esta respuesta: if ($. Trim ($ ("selector"). Html ()) == '') funcionó. .is (': vacío') no lo hizo!
Zeljko Miloradovic
62

Los espacios en blanco y los saltos de línea son los principales problemas con el uso: selector vacío. Cuidado, en CSS, la pseudo clase vacía se comporta de la misma manera. Me gusta este metodo:

if ($someElement.children().length == 0){
     someAction();
}
DMTintner
fuente
44
Elegí eso arriba porque tenía comentarios HTML en mi DIV.
Paolo
2
Con mucho, la solución más elegante, debería ser la respuesta correcta.
Christoffer Bubach
66
Tenga en cuenta que $.children()no devuelve nodos de texto o comentario, lo que significa que esta solución solo comprueba si el elemento está vacío de elementos . Si un elemento que contiene solo texto o comentarios no debe considerarse vacío para sus necesidades, entonces debe usar una de las otras soluciones.
sierrasdetandil
@sierrasdetandil para selectelementos es perfecto. La condición también puede ser if(! $el.children().length).
CPHPython
28
!elt.hasChildNodes()

Sí, lo sé, esto no es jQuery, por lo que podría usar esto:

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

¿Feliz ahora?


fuente
1
+1 Usé su enfoque dentro de una filterfunción jQuery ya que no quería usar jQuery dentro de la función a menos que fuera necesario.
WynandB
1
Si considero que solo los espacios en blanco están vacíos <div class="results"> </div>, esta declaración devolverá falso. jsfiddle.net/ytliuSVN/0pdwLt46
Penny Liu el
19
jQuery.fn.doSomething = function() {
   //return something with 'this'
};

$('selector:empty').doSomething();
AlienWebguy
fuente
¡Excelente! Me gustan las construcciones sin ifs.
Nikolay Fominyh
totalmente de acuerdo con @Nikolay, no es útil para mi situación específica, ¡pero lo recordaré para el futuro!
vitto
bueno, esto no funcionaría cuando tienes que aplicar 'esto'
Zeal Murapa
¿Qué más sería thisademás del elemento jQuery @ZealMurapa?
AlienWebguy
12

Si por "vacío", quiere decir sin contenido HTML,

if($('#element').html() == "") {
  //call function
}
Plano digital
fuente
cuidado, los espacios en blanco y los saltos de línea pueden hacer que html no sea == '' pero el elemento aún esté vacío. Verifique mi respuesta a continuación para obtener otra solución
DMTintner
8

¿Vacío como en no contiene texto?

if (!$('#element').text().length) {
    ...
}
jensgram
fuente
Esto no aborda elementos cuyo contenido son imágenes (no pregunte cómo se me ocurrió eso ...)
Solicitud incorrecta
@BadRequest No, por lo tanto, el signo de interrogación después de "como en no contiene texto ?" :)
jensgram
7

En resumen, hay muchas opciones para averiguar si un elemento está vacío:

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
}

Además, si está tratando de averiguar si un elemento de entrada está vacío, puede usar val:

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

Otra opción que debería requerir menos "trabajo" para el navegador que html()o children():

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

o

$("element").html() == "" || null
AlcaldeMonty
fuente
0

Puedes probar:

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

* Reemplazar espacios en blanco, solo en caso;)

Marc Uberstein
fuente
No !/[\S]/.test($('Selector').html())trabajar mejor, una vez que encuentre un poco de espacio en blanco que sabe que no está vacío
qwertymk
¿Por qué el / i en las banderas de expresiones regulares? ¿Hay versiones en mayúsculas y minúsculas del espacio?
Alexis Wilke
gracias, actualicé mi respuesta. No tengo idea de por qué he agregado / i
Marc Uberstein
1
@RobertMallow, Quizás regex admite \ S, sin embargo, Unicode define espacios en blanco como Cc, Zs, Zl, Zp como se muestra aquí: unicode.org/Public/UNIDATA/PropList.txt - mayúscula es Lu ...
Alexis Wilke
1
@RobertMallow, también The production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s.de ecma-international.org/ecma-262/5.1/#sec-15.10.2.12
Alexis Wilke
-1
if($("#element").html() === "")
{

}
Alex
fuente
-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
}

intenta usar algo de esto!

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

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

Prueba esto:

if (!$('#el').html()) {
    ...
}
Syed
fuente
-2

Los saltos de línea se consideran contenido para elementos en FF.

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

Ex:

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

En IE, ambos divs se consideran vacíos, en FF y Chrome solo el último está vacío.

Puede usar la solución provista por @qwertymk

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

o

$('.elements').each(function(){  // for many elements
    if(!/[\S]/.test($(this).html())) { 
        // is empty
    }
})
Corneliu
fuente