X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=74b9fee3992ffa0eee504127684af3ae12bc764f;hb=190812c3be99bde536d373b6b6ab65cfe053a532;hp=f00d9b0cd1db5620c787d7056143961ee0001e3d;hpb=2764127335126601b90aac6488ef927dce1eceda;p=jquery.git diff --git a/src/core.js b/src/core.js index f00d9b0..74b9fee 100644 --- a/src/core.js +++ b/src/core.js @@ -1,8 +1,10 @@ -// Will speed up references to window, and allows munging its name. -var window = this, - - // Will speed up references to undefined, and allows munging its name. - undefined, +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return arguments.length === 0 ? + rootjQuery : + new jQuery.fn.init( selector, context ); + }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, @@ -10,19 +12,12 @@ var window = this, // Map over the $ in case of overwrite _$ = window.$, - // Define a local copy of jQuery - jQuery, + // Use the correct document accordingly with window argument (sandbox) + document = window.document, // A central reference to the root jQuery(document) rootjQuery, - jQuery = window.jQuery = window.$ = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return selector === undefined ? - rootjQuery : - new jQuery.fn.init( selector, context ); - }, - // A simple way to check for HTML strings or ID strings // (both of which we optimize for) quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, @@ -36,11 +31,8 @@ var window = this, // Save a reference to the core toString method toString = Object.prototype.toString; -// Define the main jQuery method -jQuery = window.jQuery = window.$ = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context ); -}; +// Expose jQuery to the global object +window.jQuery = window.$ = jQuery; jQuery.fn = jQuery.prototype = { init: function( selector, context ) { @@ -83,10 +75,13 @@ jQuery.fn = jQuery.prototype = { } // Otherwise, we inject the element directly into the jQuery object - ret = jQuery( elem || null ); - ret.context = document; - ret.selector = selector; - return ret; + this.length = elem ? 1 : 0; + if ( elem ) { + this[0] = elem; + } + this.context = document; + this.selector = selector; + return this; } // HANDLE: $(expr, $(...)) @@ -127,16 +122,18 @@ jQuery.fn = jQuery.prototype = { return this.length; }, + toArray: Array.prototype.slice, + // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array - Array.prototype.slice.call( this ) : + this.toArray() : // Return just the object - this[ num ]; + ( num < 0 ? this.toArray.call(this, num)[0] : this[ num ] ); }, // Take an array of elements and push it onto the stack @@ -182,10 +179,16 @@ jQuery.fn = jQuery.prototype = { // Determine the position of an element within // the matched set of elements index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used - elem && elem.jquery ? elem[0] : elem, this ); + elem.jquery ? elem[0] : elem, this ); }, is: function( selector ) { @@ -240,9 +243,15 @@ jQuery.extend = jQuery.fn.extend = function() { // Recurse if we're merging object values if ( deep && copy && typeof copy === "object" && !copy.nodeType ) { - target[ name ] = jQuery.extend( deep, - // Never move original objects, clone them - src || ( copy.length != null ? [ ] : { } ), copy ); + var clone; + + if( src ) clone = src; + else if( jQuery.isArray(copy) ) clone = [ ]; + else if( jQuery.isObject(copy) ) clone = { }; + else clone = copy; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { @@ -278,6 +287,16 @@ jQuery.extend({ return toString.call(obj) === "[object Array]"; }, + isObject: function( obj ) { + return this.constructor.call(obj) === Object; + }, + + isEmptyObject: function( obj ) { + var name = ""; + for(name in obj) break; + return !name; + }, + // check if an element is in a (or is an) XML document isXMLDoc: function( elem ) { return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || @@ -312,10 +331,12 @@ jQuery.extend({ // args is for internal usage only each: function( object, callback, args ) { - var name, i = 0, length = object.length; + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); if ( args ) { - if ( length === undefined ) { + if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; @@ -331,7 +352,7 @@ jQuery.extend({ // A special, fast, case for the most common use of each } else { - if ( length === undefined ) { + if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; @@ -355,7 +376,7 @@ jQuery.extend({ if ( array != null ) { i = array.length; - + // The window, strings (and functions) also have 'length' if ( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval ) { ret[0] = array; @@ -383,7 +404,7 @@ jQuery.extend({ // We have to loop this way because IE & Opera overwrite the length // expando of getElementsByTagName var i = 0, elem, pos = first.length; - + // Also, we need to make sure that the correct elements are being returned // (IE returns comment nodes in a '*' query) if ( !jQuery.support.getAll ) {