aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Resig <jeresig@gmail.com>2007-08-21 08:25:11 +0000
committerJohn Resig <jeresig@gmail.com>2007-08-21 08:25:11 +0000
commitb99fd476d07e737274c132a8e938cda73cf26377 (patch)
tree3d3f858e38b0c9b6cb911423c190595de743e680
parent46e770352a9d68fe72a2cf59fc2d18fe61669730 (diff)
downloadjquery-b99fd476d07e737274c132a8e938cda73cf26377.tar.gz
jquery-b99fd476d07e737274c132a8e938cda73cf26377.zip
Using some of the ideas presented by rformato, I've significantly sped up $("#id") selection. It's now just 10% slower than doing: $(document.getElementById("test")), which seems quite acceptable. (Bug #1316)
-rw-r--r--src/jquery/jquery.js41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js
index 9eb8377e1..dfe55bc02 100644
--- a/src/jquery/jquery.js
+++ b/src/jquery/jquery.js
@@ -34,6 +34,8 @@ if ( typeof $ != "undefined" )
// Map the jQuery namespace to the '$' one
window.$ = jQuery;
+var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
+
/**
* This function accepts a string containing a CSS or
* basic XPath selector which is then used to match a set of elements.
@@ -150,22 +152,39 @@ jQuery.fn = jQuery.prototype = {
// Make sure that a selection was provided
a = a || document;
- // HANDLE: $(function)
- // Shortcut for document ready
- if ( jQuery.isFunction(a) )
- return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
-
// Handle HTML strings
if ( typeof a == "string" ) {
- // HANDLE: $(html) -> $(array)
- var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a);
- if ( m )
- a = jQuery.clean( [ m[1] ] );
+ var m = quickExpr.exec(a);
+ if ( m && (m[1] || !c) ) {
+ // HANDLE: $(html) -> $(array)
+ if ( m[1] )
+ a = jQuery.clean( [ m[1] ] );
+
+ // HANDLE: $("#id")
+ else {
+ var tmp = document.getElementById( m[3] );
+ if ( tmp )
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( tmp.id != m[3] )
+ return jQuery().find( a );
+ else {
+ this[0] = tmp;
+ this.length = 1;
+ return this;
+ }
+ else
+ a = [];
+ }
// HANDLE: $(expr)
- else
+ } else
return new jQuery( c ).find( a );
- }
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction(a) )
+ return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
return this.setArray(
// HANDLE: $(array)