382

I'm trying to call a function only if an HTML element is empty, using jQuery.

Something like this:

if (isEmpty($('#element'))) {
    // do something
}
1
  • $('#elem').text().match(/\S/) || alert('empty'); Commented Jul 26, 2017 at 16:11

19 Answers 19

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

for more info see http://api.jquery.com/is/ and http://api.jquery.com/empty-selector/

EDIT:

As some have pointed, the browser interpretation of an empty element can vary. If you would like to ignore invisible elements such as spaces and line breaks and make the implementation more consistent you can create a function (or just use the code inside of it).

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

You can also make it into a jQuery plugin, but you get the idea.

Sign up to request clarification or add additional context in comments.

8 Comments

Line breaks are considered as content to elements in FF and Chrome.
@Corneliu is correct. I posted an answer below that takes that into consideration. This was a major source of frustration for me on a recent project
Doing this with a function is nice of course, but if you want it more "embedded" (and a bit challenging), I would recommend manipulating the prototype of jQuery or using the great "filter" function ability of JQ...
@iloo, .empty does not do what you think it does. It does not check if an element is empty, it does empty the element.. :)
"the browser interpretation of an empty element can vary" It doesn't, at all. Every browser considers an element that contains whitespace to not be empty for the purposes of the :empty selector, even if you don't consider jQuery's implementation. More likely, the browser interpretation of an empty element is at odds with what authors consider to be emptiness.
|
126

I found this to be the only reliable way (since Chrome & FF consider whitespaces and linebreaks as elements):

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

6 Comments

A slightly more compressed version can take advantage of empty string's falsy-ness: if(!$.trim($("selector").html())
I don't think they consider them "elements", but they consider them nodes, which is IMO correct. You could also do if($("selector").children().length === 0) or if($("selector > *").length === 0).
I think you're confusing "elements" with "nodes".
$("selector").html().trim() === ''
I do not know why but method from this answer: if($.trim($("selector").html())=='') worked. .is(':empty') did not!
|
81
+50

White space and line breaks are the main issues with using :empty selector. Careful, in CSS the :empty pseudo class behaves the same way. I like this method:

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

4 Comments

I choosed that above because I had HTML comments in my DIV.
By far the most elegant solution, should be the correct answer.
Note that $.children() does not return text or comment nodes, which means this solution only checks is the element is empty of elements. If an element that contains only text or comments should not be considered empty for your needs, then you should use one of the other solutions.
@sierrasdetandil for select elements is perfect. the condition can also be if(! $el.children().length).
29
!elt.hasChildNodes()

Yes, I know, this is not jQuery, so you could use this:

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

Happy now?

3 Comments

+1 I used your approach inside a jQuery filter function as I didn't want to use jQuery inside the function unless necessary.
If I consider whitespace-only to be empty <div class="results"> </div>, this statement will returns false. jsfiddle.net/ytliuSVN/0pdwLt46
@PennyLiu which is correct because a space is a text node in an HTML document.
19
jQuery.fn.doSomething = function() {
   //return something with 'this'
};

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

4 Comments

Great! I like constructions without ifs.
totally agree with @Nikolay, It isn't useful for my specific situation but I'll remember it for the future!
well, this wouldn't work when you have to apply 'this'
What else would this be besides the jQuery element @ZealMurapa ?
13

If by "empty", you mean with no HTML content,

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

1 Comment

careful, whitespace and line breaks could cause html to not == '' but element still be empty. Check my answer below for another solution
13

In resume, there are many options to find out if an element is empty:

1- Using html:

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

2- Using text:

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

3- Using is(':empty'):

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

4- Using length

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

In addiction if you are trying to find out if an input element is empty you can use val:

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

Comments

8

Empty as in contains no text?

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

2 Comments

This doesn't address elements whose contents are images (don't ask how I came up with that...)
@BadRequest No, hence the question mark after "as in contains no text?" :)
2

Another option that should require less "work" for the browser than html() or children():

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

1 Comment

Refers to jQuery’s has() function, not JavaScript’s Set.has() or Map.has(). Note, though, that the "*" selector selects only elements, and does not select e.g. text nodes. Thus, <p>text</p> would be considered empty.
2

Vanilla javascript solution:

if(document.querySelector('#element:empty')) {
  //element is empty
}

Keep in mind whitespaces will affect empty, but comments do not. For more info check MDN about empty pseudo-class.

Comments

1

You can try:

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

*Replace white spaces, just incase ;)

6 Comments

Wouldn't !/[\S]/.test($('Selector').html()) work better, once you find some whitespace you know it's not empty
Why the /i in the regex flags? Are there upper and lower case versions of the space character?
thanks, updated my answer. I have no idea why I have added /i
@RobertMallow, Maybe regex supports \S, however, Unicode defines whitespaces as Cc, Zs, Zl, Zp as shown here: unicode.org/Public/UNIDATA/PropList.txt -- upper case is Lu...
@RobertMallow, also The production CharacterClassEscape :: S evaluates by returning the set of all characters not included in the set returned by CharacterClassEscape :: s. from ecma-international.org/ecma-262/5.1/#sec-15.10.2.12
|
1
document.getElementById("id").innerHTML == "" || null

or

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

Comments

0

I have seen another contributor mentioned and I wanted to emphasize it. Best and the shortest solution for this is;

 if($('#element:empty')){ do something }

Comments

-1
if($("#element").html() === "")
{

}

Comments

-1

Are you looking for jQuery.isEmptyObject() ?

http://api.jquery.com/jquery.isemptyobject/

1 Comment

This question is about empty DOM elements, not empty JavaScript objects.
-1

Here's a jQuery filter based on https://stackoverflow.com/a/6813294/698289

$.extend($.expr[':'], {
  trimmedEmpty: function(el) {
    return !$.trim($(el).html());
  }
});

Comments

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

try using any of this!

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

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

Comments

-2

Line breaks are considered as content to elements in FF.

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

Ex:

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

In IE both divs are considered empty, in FF an Chrome only the last one is empty.

You can use the solution provided by @qwertymk

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

or

$('.elements').each(function(){  // for many elements
    if(!/[\S]/.test($(this).html())) { 
        // is empty
    }
})

Comments

-2

Try this:

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.