Jak sprawdzić, czy element HTML jest pusty za pomocą jQuery?

336

Próbuję wywołać funkcję tylko wtedy, gdy element HTML jest pusty, używając jQuery.

Coś takiego:

if (isEmpty($('#element'))) {
    // do something
}
witam
źródło
$('#elem').text().match(/\S/) || alert('empty');
Thielicious

Odpowiedzi:

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

Aby uzyskać więcej informacji, zobacz http://api.jquery.com/is/ i http://api.jquery.com/empty-selector/

EDYTOWAĆ:

Jak niektórzy wskazywali, interpretacja pustego elementu w przeglądarce może się różnić. Jeśli chcesz zignorować niewidoczne elementy, takie jak spacje i podziały wierszy, i uczynić implementację bardziej spójną, możesz utworzyć funkcję (lub po prostu użyć kodu w niej zawartego).

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

Możesz także zrobić z niego wtyczkę jQuery, ale masz pomysł.

Emil
źródło
56
Podziały wiersza są uważane za treść elementów w FF i Chrome.
Corneliu,
@Corneliu jest poprawny. Poniżej zamieściłem odpowiedź, która bierze to pod uwagę. To było dla mnie głównym źródłem frustracji w związku z ostatnim projektem
DMTintner
2
To jest genialne :-D
jasonbradberry
Komentarze HTML są również uważane za treść.
Paolo,
Robienie tego za pomocą funkcji jest oczywiście miłe, ale jeśli chcesz, aby było bardziej „osadzone” (i nieco trudne),
zaleciłbym
117

Uważam, że jest to jedyny niezawodny sposób (ponieważ Chrome i FF uważają białe spacje i łamanie linii za elementy):

if($.trim($("selector").html())=='')
Serge Shultz
źródło
20
Nieco bardziej skompresowana wersja może skorzystać z falsyfikacji pustych strun:if(!$.trim($("selector").html())
Brandon Belvin
11
Nie sądzę, by uważali je za „elementy”, ale uważają je za węzły, co jest poprawne przez IMO. Możesz także zrobić if($("selector").children().length === 0)lub if($("selector > *").length === 0).
panzi
1
Myślę, że mylisz „elementy” z „węzłami”.
1
$ („selektor”). html (). trim () === ''
user1156544
1
Nie wiem dlaczego, ale metoda z tej odpowiedzi: if ($. Trim ($ ("selektor"). Html ()) == '') zadziałało. .is („: empty”) nie!
Zeljko Miloradovic
62

Białe spacje i podziały linii to główne problemy z używaniem: pustego selektora. Ostrożnie, w CSS pseudo-klasa: pusta zachowuje się w ten sam sposób. Podoba mi się ta metoda:

if ($someElement.children().length == 0){
     someAction();
}
DMTintner
źródło
4
Wybrałem to powyżej, ponieważ miałem komentarze HTML w moim DIV.
Paolo,
2
Zdecydowanie najbardziej eleganckim rozwiązaniem powinna być poprawna odpowiedź.
Christoffer Bubach,
6
Zauważ, że $.children()nie zwraca tekstowych lub komentarz węzłów, co oznacza tylko to rozwiązanie jest elementem kontroli jest pusty elementów . Jeśli element, który zawiera tylko tekst lub komentarze, nie powinien być uważany za pusty dla twoich potrzeb, powinieneś użyć jednego z innych rozwiązań.
sierrasdetandil
@ sierrasdetandil dla selectelementów jest idealny. warunek może być również if(! $el.children().length).
CPHPython
28
!elt.hasChildNodes()

Tak, wiem, to nie jest jQuery, więc możesz użyć tego:

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

Szczęśliwa teraz?


źródło
1
+1 Użyłem twojego podejścia wewnątrz filterfunkcji jQuery, ponieważ nie chciałem używać jQuery wewnątrz funkcji, chyba że jest to konieczne.
WynandB
1
Jeśli uważam, że tylko białe znaki są puste <div class="results"> </div>, to instrukcja zwróci false. jsfiddle.net/ytliuSVN/0pdwLt46
Penny Liu
19
jQuery.fn.doSomething = function() {
   //return something with 'this'
};

$('selector:empty').doSomething();
AlienWebguy
źródło
Świetny! Lubię konstrukcje bez ifs.
Nikolay Fominyh
całkowicie zgadzam się z @Nikolay, To nie jest przydatne w mojej konkretnej sytuacji, ale zapamiętam to na przyszłość!
vitto
cóż, to nie zadziałałoby, gdy musicie zastosować „to”
Zeal Murapa
Czym jeszcze byłby thiselement jQuery @ZealMurapa?
AlienWebguy
12

Jeśli przez „pusty” masz na myśli brak treści HTML,

if($('#element').html() == "") {
  //call function
}
Samolot cyfrowy
źródło
ostrożnie, białe znaki i podziały wiersza mogą powodować, że HTML nie będzie == '', ale element nadal będzie pusty. Sprawdź moją odpowiedź poniżej, aby znaleźć inne rozwiązanie
DMTintner
8

Pusty jak w nie zawiera tekstu?

if (!$('#element').text().length) {
    ...
}
jensgram
źródło
Nie dotyczy to elementów, których treść to obrazy (nie pytaj, jak to wymyśliłem ...)
Złe zapytanie
@BadRequest Nie, stąd znak zapytania po „jak w nie zawiera tekstu ?” :)
jensgram
7

W CV można znaleźć wiele opcji, aby sprawdzić, czy element jest pusty:

1- Korzystanie html:

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

2- Korzystanie text:

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

3- Korzystanie is(':empty'):

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

4- Korzystanie length

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

Nałogowo, jeśli próbujesz dowiedzieć się, czy element wejściowy jest pusty, możesz użyć val:

if (!$.trim($('input#element').val())) {
    // input with id="element" is empty, your code goes here
}
RuiVBoas
źródło
2

Innym rozwiązaniem, które powinny wymagać mniej „pracy” dla przeglądarki niż html()lub children():

function isEmpty( el ){
  return !el.has('*').length;
}
dahlbyk
źródło
1
document.getElementById("id").innerHTML == "" || null

lub

$("element").html() == "" || null
MayorMonty
źródło
0

Możesz spróbować:

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

* Zamień białe spacje, po prostu wstaw;)

Marc Uberstein
źródło
Nie !/[\S]/.test($('Selector').html())działałoby to lepiej, gdy znajdziesz trochę białych znaków, wiesz, że nie jest pusty
qwertymk
Dlaczego / i w flagach wyrażeń regularnych? Czy istnieją duże i małe wersje znaku spacji?
Alexis Wilke
dzięki, zaktualizowałem moją odpowiedź. Nie mam pojęcia, dlaczego dodałem / ja
Marc Uberstein
1
@RobertMallow, Może regex obsługuje \ S, jednak Unicode definiuje białe znaki jako Cc, Zs, Zl, Zp, jak pokazano tutaj: unicode.org/Public/UNIDATA/PropList.txt - wielkie litery to Lu ...
Alexis Wilke
1
@RobertMallow, również The production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s.z ecma-international.org/ecma-262/5.1/#sec-15.10.2.12
Alexis Wilke
-1
if($("#element").html() === "")
{

}
Alex
źródło
-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
}

spróbuj użyć dowolnego z tego!

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

document.querySelectorAll('div')[0];
document.querySelector('div'); // gets the first element.
Yash
źródło
-1

Spróbuj tego:

if (!$('#el').html()) {
    ...
}
Syed
źródło
-2

Podziały linii są traktowane jako zawartość elementów w FF.

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

Dawny:

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

W IE oba div są uważane za puste, w FF i Chrome tylko ostatni jest pusty.

Możesz skorzystać z rozwiązania dostarczonego przez @qwertymk

if(!/[\S]/.test($('#element').html())) { // for one element
    alert('empty');
}

lub

$('.elements').each(function(){  // for many elements
    if(!/[\S]/.test($(this).html())) { 
        // is empty
    }
})
Corneliu
źródło