X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=56fd0983e33862cda330974947832bde770bcf3d;hb=58235cc38ea835cde0ae90dd2919b86e47f3dd05;hp=a9e7536955d6f2c66a7e4115f8c93fb5fad2c536;hpb=cb3f842c8889458d96511b0103ebbff5cbac217d;p=jquery.git diff --git a/src/core.js b/src/core.js index a9e7536..56fd098 100644 --- a/src/core.js +++ b/src/core.js @@ -10,7 +10,9 @@ var jQuery = window.jQuery = window.$ = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context ); + return selector === undefined ? + rootjQuery : + new jQuery.fn.init( selector, context ); }, // A simple way to check for HTML strings or ID strings @@ -21,8 +23,11 @@ var jQuery.fn = jQuery.prototype = { init: function( selector, context ) { - // Make sure that a selection was provided - selector = selector || document; + // Handle $("") or $(null) + if ( !selector ) { + this.length = 0; + return this; + } // Handle $(DOMElement) if ( selector.nodeType ) { @@ -31,6 +36,7 @@ jQuery.fn = jQuery.prototype = { this.context = selector; return this; } + // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? @@ -40,34 +46,41 @@ jQuery.fn = jQuery.prototype = { if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) - if ( match[1] ) + if ( match[1] ) { selector = jQuery.clean( [ match[1] ], context ); // HANDLE: $("#id") - else { + } else { var elem = document.getElementById( match[3] ); // Handle the case where IE and Opera return items // by name instead of ID - if ( elem && elem.id != match[3] ) - return jQuery().find( selector ); + if ( elem && elem.id != match[3] ) { + return rootjQuery.find( selector ); + } // Otherwise, we inject the element directly into the jQuery object - var ret = jQuery( elem || [] ); + var ret = jQuery( elem || null ); ret.context = document; ret.selector = selector; return ret; } - // HANDLE: $(expr, [context]) + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) // (which is just equivalent to: $(content).find(expr) - } else + } else { return jQuery( context ).find( selector ); + } // HANDLE: $(function) // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) - return jQuery( document ).ready( selector ); + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } // Make sure that old selector state is passed along if ( selector.selector && selector.context ) { @@ -107,7 +120,7 @@ jQuery.fn = jQuery.prototype = { // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set - var ret = jQuery( elems ); + var ret = jQuery( elems || null ); // Add the old object onto the stack (as a reference) ret.prevObject = this; @@ -263,26 +276,31 @@ jQuery.fn = jQuery.prototype = { }, end: function() { - return this.prevObject || jQuery( [] ); + return this.prevObject || jQuery(null); }, - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: [].push, - sort: [].sort, - splice: [].splice, - find: function( selector ) { - if ( this.length === 1 ) { - var ret = this.pushStack( [], "find", selector ); - ret.length = 0; - jQuery.find( selector, this[0], ret ); - return ret; - } else { - return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ - return jQuery.find( selector, elem ); - })), "find", selector ); + var ret = this.pushStack( "", "find", selector ), length = 0, + splice = Array.prototype.splice; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + splice.call(ret, n--, 1); + break; + } + } + } + } } + + return ret; }, clone: function( events ) { @@ -1146,6 +1164,9 @@ jQuery.extend({ } }); +// All jQuery objects should point back to these +var rootjQuery = jQuery(document); + // Use of jQuery.browser is deprecated. // It's included for backwards compatibility and plugins, // although they should work to migrate away.