Difference between $(document.body) and $('body')

JqueryDocumentDocument Body

Jquery Problem Overview


I am a jQuery beginner and while going through some code examples I found:

$(document.body) and $('body')

Is there any difference between these two?

Jquery Solutions


Solution 1 - Jquery

They refer to the same element, the difference is that when you say document.body you are passing the element directly to jQuery. Alternatively, when you pass the string 'body', the jQuery selector engine has to interpret the string to figure out what element(s) it refers to.

In practice either will get the job done.

If you are interested, there is more information in the documentation for the jQuery function.

Solution 2 - Jquery

The answers here are not actually completely correct. Close, but there's an edge case.

The difference is that $('body') actually selects the element by the tag name, whereas document.body references the direct object on the document.

That means if you (or a rogue script) overwrites the document.body element (shame!) $('body') will still work, but $(document.body) will not. So by definition they're not equivalent.

I'd venture to guess there are other edge cases (such as globally id'ed elements in IE) that would also trigger what amounts to an overwritten body element on the document object, and the same situation would apply.

Solution 3 - Jquery

I have found a pretty big difference in timing when testing in my browser.

I used the following script:

> WARNING: running this will freeze your browser a bit, might even crash it.

var n = 10000000, i;
i = n;
console.time('selector');
while (i --> 0){
    $("body");
}

console.timeEnd('selector');

i = n;
console.time('element');
while (i --> 0){
    $(document.body);
}

console.timeEnd('element');

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

I did 10 million interactions, and those were the results (Chrome 65):

> selector: 19591.97509765625ms
> element: 4947.8759765625ms

Passing the element directly is around 4 times faster than passing the selector.

Solution 4 - Jquery

$(document.body) is using the global reference document to get a reference to the body, whereas $('body') is a selector in which jQuery will get the reference to the <body> element on the document.

No major difference that I can see, not any noticeable performance gain from one to the other.

Solution 5 - Jquery

There should be no difference at all maybe the first is a little more performant but i think it's trivial ( you shouldn't worry about this, really ).

With both you wrap the <body> tag in a jQuery object

Solution 6 - Jquery

Outputwise both are equivalent. Though the second expression goes through a top down lookup from the DOM root. You might want to avoid the additional overhead (however minuscule it may be) if you already have document.body object in hand for JQuery to wrap over. See http://api.jquery.com/jQuery/ #Selector Context

Solution 7 - Jquery

Today while trying to make the chrome extension example in https://developer.chrome.com/docs/extensions/mv3/getstarted/

I tried to switch

document.body.style.backgroundColor = color;

With

$("body").css("background-color", "black");

Of course it has to be said that I added this at the html file

<script src="script/jquery-3.6.0.min.js"></script>

The result is that it does not work. It will not change the background color of the page, which is what the extension is meant for.

What works though is that jQuery is still able to change/manipulate the elements "in" the extension pop up.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1617640View Question on Stackoverflow
Solution 1 - JqueryJustin EthierView Answer on Stackoverflow
Solution 2 - JqueryJerod VenemaView Answer on Stackoverflow
Solution 3 - JqueryPhiterView Answer on Stackoverflow
Solution 4 - JqueryGabeView Answer on Stackoverflow
Solution 5 - JqueryNicola PeluchettiView Answer on Stackoverflow
Solution 6 - JquerysantonView Answer on Stackoverflow
Solution 7 - Jquerycerebrus6View Answer on Stackoverflow