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
}
vitto
quelle
$('#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.

Emil
quelle
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())=='')
Serge Shultz
quelle
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();
}
DMTintner
quelle
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?


quelle
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();
AlienWebguy
quelle
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
}
Digitales Flugzeug
quelle
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) {
    ...
}
Jensgramm
quelle
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
}
RuiVBoas
quelle
2

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

function isEmpty( el ){
  return !el.has('*').length;
}
Dahlbyk
quelle
1
document.getElementById("id").innerHTML == "" || null

oder

$("element").html() == "" || null
BürgermeisterMonty
quelle
0

Du kannst es versuchen:

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

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

Marc Uberstein
quelle
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
if($("#element").html() === "")
{

}
Alex
quelle
-1

Hier ist ein jQuery-Filter, der auf https://stackoverflow.com/a/6813294/698289 basiert

$.extend($.expr[':'], {
  trimmedEmpty: function(el) {
    return !$.trim($(el).html());
  }
});
DanH
quelle
-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.
Yash
quelle
-1

Versuche dies:

if (!$('#el').html()) {
    ...
}
Syed
quelle
-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
    }
})
Corneliu
quelle