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
}

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


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

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

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?


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

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
}

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

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
}

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

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

ou

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

0

Tu peux essayer:

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

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


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

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.

-1

Essaye ça:

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

-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
    }
})
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.