Comment vérifier si un élément HTML est vide à l'aide de jQuery?

336

J'essaie d'appeler une fonction uniquement si un élément HTML est vide, en utilisant jQuery.

Quelque chose comme ça:

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

Réponses:

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

pour plus d'informations, voir http://api.jquery.com/is/ et http://api.jquery.com/empty-selector/

ÉDITER:

Comme certains l'ont souligné, l'interprétation par le navigateur d'un élément vide peut varier. Si vous souhaitez ignorer les éléments invisibles tels que les espaces et les sauts de ligne et rendre l'implémentation plus cohérente, vous pouvez créer une fonction (ou simplement utiliser le code à l'intérieur).

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

Vous pouvez également en faire un plugin jQuery, mais vous avez l'idée.

Emil
la source
56
Les sauts de ligne sont considérés comme du contenu pour les éléments dans FF et Chrome.
Corneliu
@Corneliu est correct. J'ai posté une réponse ci-dessous qui prend cela en considération. Ce fut une source majeure de frustration pour moi sur un projet récent
DMTintner
2
C'est génial :-D
jasonbradberry
Les commentaires HTML sont également considérés comme du contenu.
Paolo
Faire cela avec une fonction est bien sûr bien sûr, mais si vous le voulez plus "embarqué" (et un peu difficile), je recommanderais de manipuler le prototype de jQuery ou d'utiliser la grande fonction "filtre" de JQ ...
TheCuBeMan
117

J'ai trouvé que c'était le seul moyen fiable (puisque Chrome et FF considèrent les espaces blancs et les sauts de ligne comme des éléments):

if($.trim($("selector").html())=='')
Serge Shultz
la source
20
Une version légèrement plus compressée peut profiter de la fausseté des chaînes vides: if(!$.trim($("selector").html())
Brandon Belvin
11
Je ne pense pas qu'ils les considèrent comme des "éléments", mais ils les considèrent comme des nœuds, ce qui est correct pour l'OMI. Vous pouvez également faire if($("selector").children().length === 0)ou if($("selector > *").length === 0).
panzi
1
Je pense que vous confondez les «éléments» avec les «nœuds».
1
$ ("selector"). html (). trim () === ''
user1156544
1
Je ne sais pas pourquoi mais la méthode de cette réponse: if ($. Trim ($ ("selector"). Html ()) == '') a fonctionné. .is (': vide') ne l'a pas fait!
Zeljko Miloradovic
62

Les espaces blancs et les sauts de ligne sont les principaux problèmes liés à l'utilisation de: sélecteur vide. Attention, en CSS, la pseudo-classe: empty se comporte de la même manière. J'aime cette méthode:

if ($someElement.children().length == 0){
     someAction();
}
DMTintner
la source
4
J'ai choisi cela ci-dessus parce que j'avais des commentaires HTML dans ma DIV.
Paolo
2
La solution de loin la plus élégante devrait être la bonne réponse.
Christoffer Bubach
6
Notez que $.children()ne renvoie pas de nœuds de texte ou de commentaire, ce qui signifie que cette solution vérifie uniquement que l'élément est vide d' éléments . Si un élément qui ne contient que du texte ou des commentaires ne doit pas être considéré comme vide pour vos besoins, vous devez utiliser l'une des autres solutions.
sierrasdetandil
@sierrasdetandil pour les selectéléments est parfait. la condition peut également être if(! $el.children().length).
CPHPython
28
!elt.hasChildNodes()

Oui, je sais, ce n'est pas jQuery, vous pouvez donc l'utiliser:

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

Heureux maintenant?


la source
1
+1 J'ai utilisé votre approche dans une filterfonction jQuery car je ne voulais pas utiliser jQuery dans la fonction sauf si nécessaire.
WynandB
1
Si je considère que l'espace blanc uniquement est vide <div class="results"> </div>, cette déclaration renvoie false. jsfiddle.net/ytliuSVN/0pdwLt46
Penny Liu
19
jQuery.fn.doSomething = function() {
   //return something with 'this'
};

$('selector:empty').doSomething();
AlienWebguy
la source
Génial! J'aime les constructions sans if.
Nikolay Fominyh
totalement d'accord avec @Nikolay, ce n'est pas utile pour ma situation spécifique mais je m'en souviendrai pour l'avenir!
vitto
eh bien, cela ne fonctionnerait pas lorsque vous devez appliquer «ceci»
Zeal Murapa
Que serait-ce d'autre thisque l'élément jQuery @ZealMurapa?
AlienWebguy
12

Si par "vide", vous voulez dire sans contenu HTML,

if($('#element').html() == "") {
  //call function
}
Avion numérique
la source
attention, les espaces blancs et les sauts de ligne peuvent faire en sorte que le html ne soit pas == '' mais l'élément est toujours vide. Consultez ma réponse ci-dessous pour une autre solution
DMTintner
8

Vide comme dans ne contient pas de texte?

if (!$('#element').text().length) {
    ...
}
jensgram
la source
Cela ne concerne pas les éléments dont le contenu est des images (ne me demandez pas comment j'ai trouvé ça ...)
Bad Request
@BadRequest Non, d'où le point d'interrogation après "comme dans ne contient aucun texte ?" :)
jensgram
7

En résumé, il existe de nombreuses options pour savoir si un élément est vide:

1- Utilisation html:

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

2- Utilisation text:

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

3- Utilisation is(':empty'):

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

4- Utilisation length

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

De plus, si vous essayez de savoir si un élément d'entrée est vide, vous pouvez utiliser val:

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

Une autre option qui devrait nécessiter moins de "travail" pour le navigateur que html()ou children():

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

ou

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

Tu peux essayer:

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

* Remplacez les espaces blancs, au cas où;)

Marc Uberstein
la source
Ne !/[\S]/.test($('Selector').html())fonctionnerait pas mieux, une fois que vous avez trouvé un espace, vous savez qu'il n'est pas vide
qwertymk
Pourquoi le / i dans les drapeaux d'expression régulière? Existe-t-il des versions majuscules et minuscules du caractère espace?
Alexis Wilke
merci, mis à jour ma réponse. Je ne sais pas pourquoi j'ai ajouté / i
Marc Uberstein
1
@RobertMallow, Peut-être que regex prend en charge \ S, cependant, Unicode définit les espaces blancs comme Cc, Zs, Zl, Zp comme indiqué ici: unicode.org/Public/UNIDATA/PropList.txt - les majuscules sont Lu ...
Alexis Wilke
1
@RobertMallow, également 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
la source
-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
}

essayez d'utiliser tout cela!

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

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

Essaye ça:

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

Les sauts de ligne sont considérés comme du contenu aux éléments dans FF.

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

Ex:

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

Dans IE, les deux divs sont considérées comme vides, dans FF an Chrome, seul le dernier est vide.

Vous pouvez utiliser la solution fournie par @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
la source