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
}

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


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

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

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?


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

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

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

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
}

2

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

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

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

lub

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

0

Możesz spróbować:

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

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


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

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.


-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
    }
})
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.