Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery :first vs. .first()

The .first() method was added in jQuery 1.4.

The :first selector has been around since 1.0.

From the docs:

:first

The :first pseudo-class is equivalent to :eq(0). It could also be written as :lt(1). While this matches only a single element, :first-child can match more than one: One for each parent.

.first()

Given a jQuery object that represents a set of DOM elements, the .first() method constructs a new jQuery object from the first matching element.


It seems that .first() is a filter that returns another jQuery object, while :first is just a selector.

But, they can both be used to accomplish the same thing.

So, when should one be used instead of the other? Performance? Please provide examples.

like image 567
ScottE Avatar asked Feb 22 '10 17:02

ScottE


2 Answers

If .first() and :first are used in the same context to get the same information, example:

Html:

<ul>   <li>One</li>   <li>Two</li>   <li>Three</li>   <li>Four</li>   <li>Five</li> </ul> 

Script:

console.log("1", $('ul li').first().text()); console.log("2", $('ul li:first').text()); 

.first() is more performant

** enter image description here

As mentionned by Andrew Moore, .first() is the equivalent of .eq(0).
According to jsperf.com, .eq(0) would be the best, but there is no big difference with .first().

You can see my source, here: http://jsperf.com/first-vs-first-vs-eq-0

like image 113
Simon Arnold Avatar answered Sep 25 '22 03:09

Simon Arnold


.first() can be used to select the first element in a jQuery collection.

Basically, it avoids having to do a new query or break the chain in situations when you need to work on a collection and then exclusively on the first element.

Actually, one of the most costly operations you can do in jQuery is a query. The less you do, the better it is...

One example I can think of right now is an image gallery script where your first image is always the default active one, yet you need to attach an event handler on each image...

$('#gallery img').click(myFunc).first().addClass('active');  // Instead of $('#gallery img').click(myFunc); $('#gallery img:first').addClass('active'); 

.first() is also syntactic sugar for something that exists since 1.1.2... .eq(0):

$('#gallery img').click(myFunc).eq(0).addClass('active'); 

in fact, that's how it is implemented in jQuery itself:

first: function() {   return this.eq( 0 ); } 
like image 26
Andrew Moore Avatar answered Sep 22 '22 03:09

Andrew Moore