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)

This commit is contained in:
John Resig 2007-08-21 08:25:11 +00:00
parent 46e770352a
commit b99fd476d0

41
src/jquery/jquery.js vendored
View file

@ -34,6 +34,8 @@ if ( typeof $ != "undefined" )
// Map the jQuery namespace to the '$' one // Map the jQuery namespace to the '$' one
window.$ = jQuery; window.$ = jQuery;
var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
/** /**
* This function accepts a string containing a CSS or * This function accepts a string containing a CSS or
* basic XPath selector which is then used to match a set of elements. * 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 // Make sure that a selection was provided
a = a || document; 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 // Handle HTML strings
if ( typeof a == "string" ) { if ( typeof a == "string" ) {
// HANDLE: $(html) -> $(array) var m = quickExpr.exec(a);
var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a); if ( m && (m[1] || !c) ) {
if ( m ) // HANDLE: $(html) -> $(array)
a = jQuery.clean( [ m[1] ] ); 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) // HANDLE: $(expr)
else } else
return new jQuery( c ).find( a ); 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( return this.setArray(
// HANDLE: $(array) // HANDLE: $(array)