Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect if a jQuery object is on the page or not

Tags:

jquery

dom

Given a jQuery object, $j, I need to know if it represents something that is already on the page or if it is something that has not yet been put on the page. For example, if I have this:

$j = $('#id-of-something-already-on-the-page');

or

$j = $('<p>Where is pancake house?</p>').appendTo($('#this-is-already-there'));

Then I have something on the page and I don't need to put it on the page. But, if I just have this:

$j = $("<p>I'll cook you some eggs, Margie.</p>");

Then I'd need to append it before it is on the page.

The question is how do you ask $j if it is on the page or not? I know two ways the work well enough:

  1. See if it has a parent: $j.parent().length > 0 implies that it is on the page.
  2. See if it has a valid index: $j.index() > -1 implies that it is on the page.

I can see the first one failing if $j is the html or possibly body; I'm happy to ignore those two pathological cases. I can't think of any way that the second approach would fail.

Is there a standard technique for asking if a jQuery object is on the page or not? I don't care if $j is visible.

like image 956
mu is too short Avatar asked Mar 25 '11 03:03

mu is too short


People also ask

How check element is present or not in jQuery?

In jQuery, you can use the . length property to check if an element exists. if the element exists, the length property will return the total number of the matched elements. To check if an element which has an id of “div1” exists.

How do you check if an object is a jQuery object?

The best way to check the instance of an object is through instanceof operator or with the method isPrototypeOf() which inspects if the prototype of an object is in another object's prototype chain.

What is $() in jQuery?

$() = window. jQuery() $()/jQuery() is a selector function that selects DOM elements. Most of the time you will need to start with $() function. It is advisable to use jQuery after DOM is loaded fully.


3 Answers

Personally, I'd start by descending from an element you know is in the page, like <html> or <body>, and use .has():

if ($('html').has($j).length)
{
    // $j is in the page
}

This works even for the two pathological cases you mentioned. It's more idiomatic to check .length rather than .size(). There's also no reason to check that the value returned is > 0. The length property will always be a nonnegative integer, so it's sufficient to check the truthiness of the value.

like image 117
Matt Ball Avatar answered Nov 09 '22 09:11

Matt Ball


I'd probably just check to see if the element can reach the body element:

$j.closest('body').size()>0

As you noted in other comments, this would fail in some exceptional cases where you are handling extra body elements. If you really want to detect those situations, I guess you could check to see if you have multiple $(body) elements but I suspect that such extreme cases will get out of control pretty quickly.

This "is-probably-attached-to-page" check could be turned in to a bona-fide jQuery selector, too:

$.expr[':'].isProbablyAttached = function(obj){

    return $(obj).closest('body').size()>0;
};

// Usage:
$('.someClasses:isProbablyAttached').doSomething();
like image 40
Michael Haren Avatar answered Nov 09 '22 11:11

Michael Haren


With jQuery (at least with version 1.7.1) $('html').parent() returns a non-empty array ([#document]):

$j = $("<p>I'll cook you some eggs, Margie.</p>");
$j.parent().length === 0
$('html').parent().length === 1
$('body').parent().length === 1

So 'mu is too short''s note is not an issue:

I can see the first one failing if $j is the html or possibly body; I'm happy to ignore those two pathological cases. I can't think of any way that the second approach would fail.

like image 38
Koen. Avatar answered Nov 09 '22 10:11

Koen.