Come posso verificare se un elemento HTML è vuoto usando jQuery?


336

Sto provando a chiamare una funzione solo se un elemento HTML è vuoto, usando jQuery.

Qualcosa come questo:

if (isEmpty($('#element'))) {
    // do something
}

$('#elem').text().match(/\S/) || alert('empty');
Thielicious il

Risposte:


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

per maggiori informazioni consultare http://api.jquery.com/is/ e http://api.jquery.com/empty-selector/

MODIFICARE:

Come alcuni hanno sottolineato, l'interpretazione del browser di un elemento vuoto può variare. Se desideri ignorare elementi invisibili come spazi e interruzioni di riga e rendere l'implementazione più coerente, puoi creare una funzione (o semplicemente usare il codice al suo interno).

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

Puoi anche trasformarlo in un plugin jQuery, ma hai l'idea.


56
Le interruzioni di riga sono considerate come contenuto di elementi in FF e Chrome.
Corneliu,

@Corneliu è corretto. Di seguito ho pubblicato una risposta che ne tiene conto. Questa è stata una grande fonte di frustrazione per me in un recente progetto
DMTintner,

2
Questo è geniale :-D
jasonbradberry il

Anche i commenti HTML sono considerati contenuti.
Paolo,

Farlo con una funzione è ovvio, ma se lo vuoi più "incorporato" (e un po 'impegnativo), consiglierei di manipolare il prototipo di jQuery o di usare l'eccezionale capacità di "filtro" di JQ ...
TheCuBeMan

117

Ho trovato questo l'unico modo affidabile (dal momento che Chrome e FF considerano gli spazi bianchi e le interruzioni di riga come elementi):

if($.trim($("selector").html())=='')

20
Una versione leggermente più compressa può trarre vantaggio dalla falsità della stringa vuota: if(!$.trim($("selector").html())
Brandon Belvin

11
Non penso che li considerino "elementi", ma li considerano nodi, il che è IMO corretto. Potresti anche fare if($("selector").children().length === 0)o if($("selector > *").length === 0).
Panzi,

1
Penso che stai confondendo "elementi" con "nodi".

1
$ ("selettore"). html (). trim () === ''
user1156544

1
Non so perché ma il metodo da questa risposta: if ($. Trim ($ ("selector"). Html ()) == '') ha funzionato. .is (': vuoto') no!
Zeljko Miloradovic,

62

Spazi vuoti e interruzioni di riga sono i problemi principali relativi all'utilizzo di: selettore vuoto. Attenzione, nei CSS la pseudo classe: vuota si comporta allo stesso modo. Mi piace questo metodo:

if ($someElement.children().length == 0){
     someAction();
}

4
L'ho scelto sopra perché avevo commenti HTML nel mio DIV.
Paolo,

2
Di gran lunga la soluzione più elegante, dovrebbe essere la risposta corretta.
Christoffer Bubach,

6
Si noti che $.children()non restituisce nodi di testo o di commento, il che significa che questa soluzione verifica solo se l'elemento è vuoto di elementi . Se un elemento che contiene solo testo o commenti non deve essere considerato vuoto per le tue esigenze, allora dovresti usare una delle altre soluzioni.
sierrasdetandil,

@sierrasdetandil for selectelements è perfetto. la condizione può anche essere if(! $el.children().length).
CPHPython,

28
!elt.hasChildNodes()

Sì, lo so, questo non è jQuery, quindi puoi usare questo:

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

Felice adesso?


1
+1 Ho usato il tuo approccio all'interno di una filterfunzione jQuery poiché non volevo usare jQuery all'interno della funzione a meno che non fosse necessario.
WynandB,

1
Se considero solo gli spazi bianchi vuoti <div class="results"> </div>, questa affermazione restituirà false. jsfiddle.net/ytliuSVN/0pdwLt46
Penny Liu

19
jQuery.fn.doSomething = function() {
   //return something with 'this'
};

$('selector:empty').doSomething();

Grande! Mi piacciono le costruzioni senza se.
Nikolay Fominyh,

sono assolutamente d'accordo con @Nikolay, non è utile per la mia situazione specifica, ma lo ricorderò per il futuro!
vitto,

bene, questo non funzionerebbe quando dovresti applicare 'questo'
Zeal Murapa,

Cos'altro sarebbe thisoltre all'elemento jQuery @ZealMurapa?
AlienWebguy,

12

Se per "vuoto" intendi senza contenuto HTML,

if($('#element').html() == "") {
  //call function
}

attenzione, gli spazi bianchi e le interruzioni di riga potrebbero far sì che html non sia == '' ma l'elemento sia ancora vuoto. Controlla la mia risposta di seguito per un'altra soluzione
DMTintner,

8

Vuoto come in non contiene testo?

if (!$('#element').text().length) {
    ...
}

Questo non riguarda elementi il ​​cui contenuto è costituito da immagini (non chiedermi come sono arrivato a quello ...)
Richiesta non

@BadRequest No, quindi il punto interrogativo dopo "come in non contiene testo ?" :)
jensgram,

7

Nel riassunto, ci sono molte opzioni per scoprire se un elemento è vuoto:

1- Utilizzo html:

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

2- Utilizzo text:

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

3- Utilizzo is(':empty'):

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

4- Utilizzo length

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

Inoltre, se stai cercando di scoprire se un elemento di input è vuoto, puoi utilizzare val:

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

2

Un'altra opzione che dovrebbe richiedere meno "lavoro" per il browser di html()o children():

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

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

o

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

0

Puoi provare:

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

* Sostituisci gli spazi bianchi, basta inserire;)


Non !/[\S]/.test($('Selector').html())funzionerebbe meglio, una volta trovato uno spazio bianco sai che non è vuoto
qwertymk,

Perché il / i nei flag regex? Esistono versioni maiuscole e minuscole del carattere spazio?
Alexis Wilke,

grazie, aggiornata la mia risposta. Non ho idea del motivo per cui ho aggiunto / i
Marc Uberstein il

1
@RobertMallow, Forse regex supporta \ S, tuttavia Unicode definisce gli spazi bianchi come Cc, Zs, Zl, Zp come mostrato qui: unicode.org/Public/UNIDATA/PropList.txt - il maiuscolo è Lu ...
Alexis Wilke

1
@RobertMallow, anche The production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s.da ecma-international.org/ecma-262/5.1/#sec-15.10.2.12
Alexis Wilke

-1
if($("#element").html() === "")
{

}



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

prova a usare uno di questi!

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

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

-1

Prova questo:

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

-2

Le interruzioni di riga sono considerate come contenuto di elementi in FF.

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

Ex:

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

In IE entrambi i div sono considerati vuoti, in FF un Chrome è vuoto solo l'ultimo.

È possibile utilizzare la soluzione fornita da @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
    }
})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.