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