Wie überprüfe ich mit jQuery, ob ein HTML-Element leer ist?


336

Ich versuche, eine Funktion nur mit jQuery aufzurufen, wenn ein HTML-Element leer ist.

Etwas wie das:

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

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

Antworten:


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

Weitere Informationen finden Sie unter http://api.jquery.com/is/ und http://api.jquery.com/empty-selector/.

BEARBEITEN:

Wie einige darauf hingewiesen haben, kann die Browserinterpretation eines leeren Elements variieren. Wenn Sie unsichtbare Elemente wie Leerzeichen und Zeilenumbrüche ignorieren und die Implementierung konsistenter gestalten möchten, können Sie eine Funktion erstellen (oder einfach den darin enthaltenen Code verwenden).

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

Sie können es auch zu einem jQuery-Plugin machen, aber Sie haben die Idee.


56
Zeilenumbrüche gelten als Inhalt für Elemente in FF und Chrome.
Corneliu

@ Corneliu ist richtig. Ich habe unten eine Antwort gepostet, die dies berücksichtigt. Dies war eine große Quelle der Frustration für mich bei einem kürzlich durchgeführten Projekt
DMTintner

2
Das ist genial :-D
Jasonbradberry

HTML-Kommentare gelten ebenfalls als Inhalt.
Paolo

Dies mit einer Funktion zu tun ist natürlich nett, aber wenn Sie es "eingebetteter" (und etwas herausfordernder) wollen, würde ich empfehlen, den Prototyp von jQuery zu manipulieren oder die großartige "Filter" -Funktion von JQ zu verwenden ...
TheCuBeMan

117

Ich fand, dass dies der einzig zuverlässige Weg ist (da Chrome & FF Leerzeichen und Zeilenumbrüche als Elemente betrachten):

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

20
Eine etwas komprimiertere Version kann die Falschheit der leeren Saite ausnutzen:if(!$.trim($("selector").html())
Brandon Belvin

11
Ich denke nicht, dass sie sie als "Elemente" betrachten, aber sie betrachten sie als Knoten, was IMO korrekt ist. Sie könnten auch tun if($("selector").children().length === 0)oder if($("selector > *").length === 0).
Panzi

1
Ich denke, Sie verwechseln "Elemente" mit "Knoten".

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

1
Ich weiß nicht warum, aber Methode aus dieser Antwort: if ($. Trim ($ ("Selektor"). Html ()) == '') hat funktioniert. .ist (': leer') nicht!
Zeljko Miloradovic

62

Leerzeichen und Zeilenumbrüche sind die Hauptprobleme bei der Verwendung von: leerer Auswahl. Achtung, in CSS verhält sich die leere Pseudoklasse genauso. Ich mag diese Methode:

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

4
Ich habe das oben gewählt, weil ich HTML-Kommentare in meinem DIV hatte.
Paolo

2
Die mit Abstand eleganteste Lösung sollte die richtige Antwort sein.
Christoffer Bubach

6
Beachten Sie, dass $.children(), keinen Text oder Kommentar Knoten zurück , die diese Lösung nur überprüft , bedeutet das Element leer ist Elemente . Wenn ein Element, das nur Text oder Kommentare enthält, für Ihre Anforderungen nicht als leer betrachtet werden sollte, sollten Sie eine der anderen Lösungen verwenden.
Sierra Detandil

@sierrasdetandil für selectElemente ist perfekt. die Bedingung kann auch sein if(! $el.children().length).
CPHPython

28
!elt.hasChildNodes()

Ja, ich weiß, das ist nicht jQuery, also könnten Sie dies verwenden:

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

Jetzt glücklich?


1
+1 Ich habe Ihren Ansatz in einer jQuery- filterFunktion verwendet, da ich jQuery nicht in der Funktion verwenden wollte, es sei denn, dies ist erforderlich.
WynandB

1
Wenn ich nur Leerzeichen als leer betrachte <div class="results"> </div>, gibt diese Anweisung false zurück. jsfiddle.net/ytliuSVN/0pdwLt46
Penny Liu

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

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

Großartig! Ich mag Konstruktionen ohne Wenn.
Nikolay Fominyh

stimme @Nikolay voll und ganz zu. Es ist für meine spezielle Situation nicht nützlich, aber ich werde mich für die Zukunft daran erinnern!
Vitto

Nun

Was wäre thisaußer dem jQuery-Element @ZealMurapa noch etwas anderes?
AlienWebguy

12

Wenn mit "leer" gemeint ist, ohne HTML-Inhalt,

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

Vorsicht, Leerzeichen und Zeilenumbrüche können dazu führen, dass HTML nicht == '' ist, das Element jedoch noch leer ist. Überprüfen Sie meine Antwort unten für eine andere Lösung
DMTintner

8

Leer wie in enthält keinen Text?

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

Dies betrifft keine Elemente, deren Inhalt Bilder sind (fragen Sie nicht, wie ich darauf gekommen bin ...)
Bad Request

@BadRequest Nein, daher das Fragezeichen nach "wie in enthält keinen Text ?" :)
Jensgramm

7

Im Lebenslauf gibt es viele Optionen, um herauszufinden, ob ein Element leer ist:

1- Verwenden von html:

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

2- Verwenden von text:

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

3- Verwenden von is(':empty'):

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

4- Verwenden length

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

Wenn Sie in Sucht suchen, um herauszufinden, ob ein Eingabeelement leer ist, können Sie Folgendes verwenden val:

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

2

Eine weitere Option, die weniger "Arbeit" für den Browser erfordern sollte als html()oder children():

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


0

Du kannst es versuchen:

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

* Ersetzen Sie Leerzeichen, nur für den Fall;)


Würde nicht !/[\S]/.test($('Selector').html())besser funktionieren, wenn Sie ein Leerzeichen gefunden haben, wissen Sie, dass es nicht leer ist
qwertymk

Warum das / i in den Regex-Flags? Gibt es Groß- und Kleinbuchstaben des Leerzeichens?
Alexis Wilke

danke, aktualisierte meine Antwort. Ich habe keine Ahnung, warum ich / i
Marc Uberstein

1
@RobertMallow, Vielleicht unterstützt Regex \ S, Unicode definiert jedoch Leerzeichen als Cc, Zs, Zl, Zp wie hier gezeigt: unicode.org/Public/UNIDATA/PropList.txt - Großbuchstaben sind Lu ...
Alexis Wilke

1
@ RobertMallow, auch The production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s.von 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
}

versuchen Sie es mit irgendetwas davon!

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

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

-1

Versuche dies:

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

-2

Zeilenumbrüche gelten als Inhalt für Elemente in FF.

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

Ex:

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

Im IE werden beide Divs als leer betrachtet, in FF und Chrome ist nur der letzte leer.

Sie können die von @qwertymk bereitgestellte Lösung verwenden

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

oder

$('.elements').each(function(){  // for many elements
    if(!/[\S]/.test($(this).html())) { 
        // is empty
    }
})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.