Side navigation
#11785 closed bug (patchwelcome)
Opened May 18, 2012 07:24PM UTC
Closed June 12, 2012 01:10PM UTC
Last modified November 24, 2012 03:32AM UTC
.findOne() method
| Reported by: | dmethvin | Owned by: | |
|---|---|---|---|
| Priority: | undecided | Milestone: | None |
| Component: | unfiled | Version: | 1.7.2 |
| Keywords: | Cc: | ||
| Blocked by: | Blocking: |
Description
There would certainly be a performance benefit to this on platforms that support querySelector() which is most of them these days.
http://forum.jquery.com/topic/why-there-is-no-jquery-findone-method-or-smth-similar
Also, perhaps we could automatically change $("anything:first") to use querySelector()?
Attachments (0)
Change History (7)
Changed May 18, 2012 07:32PM UTC by comment:1
Changed May 19, 2012 11:07PM UTC by comment:2
| _comment0: | I think `findFirst()` is more appropriate then `findOne()` for several reasons: 1) It is more similar to the `.first()` method and the `:first` filter. 2) it removes any doubt in case of not simple selectors. Consider `".boo, .foo"`. We expect the `".foo"` element if it precedes the `".boo"` one, becouse it is how `querySelector()` works. \ \ So, I suggest three additions: \ 1. `jQuery.findFirst()`, that behaves like `jQuery.find("...")[0] || null`. \ 2. `jQuery.first()`, that returns `jQuery( jQuery.findFirst("...") )`. \ 3. `jQuery.fn.findFirst()`... \ \ Note how those additions would play nicely with the existent API. For example: \ \ * `$(".boo").first()` **or** `$.first(".boo")` \ * `$(".foo").find(".boo:first")` **or** `$(".foo").findFirst(".boo")` \ → 1337470325942110 |
|---|---|
| _comment1: | I think `findFirst()` is more appropriate then `findOne()` for several reasons: 1) It is more similar to the `.first()` method and the `:first` filter. 2) it removes any doubt in case of not simple selectors. Consider `".boo, .foo"`. We expect the `".foo"` element if it precedes the `".boo"` one, becouse it is how `querySelector()` works. \ \ So, I suggest three additions: \ 1. `jQuery.findFirst()`, that behaves like `jQuery.find("...")[0] || null`. \ 2. `jQuery.first()`, that returns `jQuery( jQuery.findFirst("...") )`. **OPTIONAL** \ 3. `jQuery.fn.findFirst()`... \ \ Note how those additions would play nicely with the existent API. For example: \ \ * `$(".boo").first()` **or** `$.first(".boo")` **OPTIONAL** \ * `$(".foo").find(".boo:first")` **or** `$(".foo").findFirst(".boo")` \ → 1337471489323991 |
| _comment2: | I think `findFirst()` is more appropriate then `findOne()` for several reasons: 1) It is more similar to the `.first()` method and the `:first` filter. 2) it removes any doubt in case of not simple selectors. Consider `".boo, .foo"`. We expect the `".foo"` element if it precedes the `".boo"` one, becouse it is how `querySelector()` works. \ \ So, I suggest three additions: \ 1. `jQuery.findFirst()`, that behaves like `jQuery.find("...")[0] || null`. \ 2. `jQuery.first()`, that returns `jQuery( jQuery.findFirst("...") )`. **OPTIONAL** \ 3. `jQuery.fn.findFirst()`... \ \ Note how those additions would play nicely with the existent API. For example: \ \ * `$(".boo").first()` **or** `$.first(".boo")` **OPTIONAL** \ * `$(".foo").find(".boo:first")` **or** `$(".foo").findFirst(".boo")` \ \ **EDIT:** Rethinking, I come with the conclusion that `jQuery.first()` would introduce confusion to the API, since `.first()` is for "filtering" and not for "searching"... so I marked it as optional. → 1337471775170140 |
I think findFirst() is more appropriate then findOne() for several reasons: 1) It is more similar to the .first() method and the :first filter. 2) it removes any doubt in case of not simple selectors. Consider ".boo, .foo". We expect the ".foo" element if it precedes the ".boo" one, becouse it is how querySelector() works.
So, I suggest ~~three~~ two additions:
1. jQuery.findFirst(), that behaves like jQuery.find("...")[0] || null
2. jQuery.fn.findFirst()...
3. ~~jQuery.first(), that returns jQuery( jQuery.findFirst("...") )~~
Note how those additions would play nicely with the existent API. For example:
$(".foo").find(".boo:first")**or**$(".foo").findFirst(".boo")- ~~
$(".boo").first()**or**$.first(".boo")~~
**EDIT:** Rethinking, I come with the conclusion that jQuery.first() would introduce confusion to the API, since .first() is for "filtering" and not for "searching"...
Changed May 20, 2012 02:54AM UTC by comment:3
After some consideration and re-reading the forum post, I dont think this makes sense. jQuery's API expects jQuery objects, querySelector is a node, not a list of nodes - so it wouldn't work with the current API anyway... Unless we shove it into a jQuery object, then we're back to good ol' jQuery(selector)
Changed May 23, 2012 10:58PM UTC by comment:4
I did a quick jsperf to see if it seemed worth the effort. I thought for sure that it would be. Now I am not so sure, can anyone see something wrong here?
http://jsperf.com/findone-vs-findall
Once these are wrapped in the overhead of Sizzle I doubt they will be that much different.
Changed June 12, 2012 01:10PM UTC by comment:5
| resolution: | → patchwelcome |
|---|---|
| status: | new → closed |
Per the jsperf I did, it doesn't seem worth adding this method since it's not faster. If someone wants to come up with a full implementation and perf tests proving otherwise we can reopen.
Changed November 24, 2012 03:01AM UTC by comment:6
Putting aside performance for a second, am I the only one that often will look for a single element on the page?
I typically either want to process any number of entries (0, 1 or more), or 1; in the later case, a findOne would be helpful if it raised an exception if none is found.
Changed November 24, 2012 03:32AM UTC by comment:7
Not everything needs to be built into jQuery. That's why we have plugins.
jQuery.fn.findOne = function( selector ) {
var result = this.find( selector );
if ( this.length != 1 ) {
jQuery.error( "Didn't find one " + selector );
}
return this;
};
+1 to this