¿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
}

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


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())=='')

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();
}

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?


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();

¡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
}

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) {
    ...
}

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
}

2

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

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

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

o

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

0

Puedes probar:

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

* Reemplazar espacios en blanco, solo en caso;)


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

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.

-1

Prueba esto:

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

-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
    }
})
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.