From b99fd476d07e737274c132a8e938cda73cf26377 Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 21 Aug 2007 08:25:11 +0000 Subject: [PATCH] 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) --- src/jquery/jquery.js | 41 ++++++++++++++++++++++++++++++----------- 1 file 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)