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.