jQuery uses a selector engine called Sizzle.Sizzle has various ways of selecting elements. Selecting elements is one of the fundamental part of jQuery, hence it’s important we learn how to optimize our selectors. jQuery selector Engine runs from right to left. Being specific on the left hand side has a lot less value than being specific on the right hand side.
$(“.parent .child”)//This is how the selector engine works.
A common misconception is that being accurate makes the selector works faster as it knows where to find the DOM element. But that is not the case. jQuery has a very different way in which it handles selecting by id or selecting by class.
<ul class=”listing”> <li class=”bullet”> <h3 class=”mainelement”> This is a test<h3> </li> <ul>
$(‘ul.listing li.bullet h3.mainelement’) //though is the most specific is not the fastest.
The fastest selector is simply the class name by itself.
Anything else is telling jQuery to do more work than necessary. Starting from the right that is all that we need to get the set of elements.
<ul class=”listing”> <li id=”bullet”> <h3 class=”mainelement”> This is a test<h3> </li> <ul>
Now since we have an id. We can further bring down the time required by selecting with ID.
$(‘#bullet .mainelement’)//Sizzle operates differently when the first selector is ID
But to really speed things up, we can use
$(‘#bullet’).children(‘.mainelement’) or $(‘#bullet’).find(‘.mainelement’)
The latter being the fastest. To understand the discrepancy we must look into the jQuery Source. When the only part of the selector is an ID jQuery uses document.getElementById(id) which drastically reduces the time taken.
$(‘p#randomid’) //jQuery will use getElementsByTagName(), then iterate though the array of elements for the above selector.
var div = $(‘#randomId’);ßjQuery will use getElementById() for the above selector
From the source code we can see, the fastest selector is
$(‘ ‘)//Returns an empty jQuery object. $(‘body’)//Next in line, jQuery converts this to document.body $(‘#id’)//Third fastest, jQuery converts this to document.getElementById(‘id’)
Now to distinguish between children() and find(), Children only looks at the immediate children of the node, while find traverses the entire DOM below the node. But in general cases find is faster. children () internally makes calls to sibling(), filter(), and goes through a few more regexes than find() does. find () and children() fulfill different needs, but in the cases where find() and children() would output the same result, it’s better to use find().