X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=8743f05c49e54dc50ce3be0e965a58d83e32e8a3;hb=28182b43209b0e62b9ca2192671fc26644953717;hp=42fd8d499be454b34b3b5791ced7b08b7d4fd311;hpb=858d56fc8e26a686cb19d1e35b0c2e8953987e49;p=jquery.git diff --git a/src/core.js b/src/core.js index 42fd8d4..8743f05 100644 --- a/src/core.js +++ b/src/core.js @@ -11,7 +11,7 @@ // Map over jQuery in case of overwrite var _jQuery = window.jQuery, -// Map over the $ in case of overwrite +// Map over the $ in case of overwrite _$ = window.$; var jQuery = window.jQuery = window.$ = function( selector, context ) { @@ -24,7 +24,10 @@ var jQuery = window.jQuery = window.$ = function( selector, context ) { var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/, // Is it a simple selector - isSimple = /^.[^:#\[\.]*$/; + isSimple = /^.[^:#\[\.]*$/, + +// Will speed up references to undefined, and allows munging its name. + undefined; jQuery.fn = jQuery.prototype = { init: function( selector, context ) { @@ -75,10 +78,10 @@ jQuery.fn = jQuery.prototype = { // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector ); - + return this.setArray(jQuery.makeArray(selector)); }, - + // The current version of jQuery being used jquery: "@VERSION", @@ -86,7 +89,7 @@ jQuery.fn = jQuery.prototype = { size: function() { return this.length; }, - + // The number of elements contained in the matched element set length: 0, @@ -101,7 +104,7 @@ jQuery.fn = jQuery.prototype = { // Return just the object this[ num ]; }, - + // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { @@ -114,7 +117,7 @@ jQuery.fn = jQuery.prototype = { // Return the newly-formed element set return ret; }, - + // Force the current matched set of elements to become // the specified array of elements (destroying the stack in the process) // You should use pushStack() in order to do this, but maintain the stack @@ -123,7 +126,7 @@ jQuery.fn = jQuery.prototype = { // is a super-fast way to populate an object with array-like properties this.length = 0; Array.prototype.push.apply( this, elems ); - + return this; }, @@ -134,13 +137,13 @@ jQuery.fn = jQuery.prototype = { return jQuery.each( this, callback, args ); }, - // Determine the position of an element within + // Determine the position of an element within // the matched set of elements index: function( elem ) { var ret = -1; // Locate the position of the desired element - return jQuery.inArray( + return jQuery.inArray( // If it receives a jQuery object, the first element is used elem && elem.jquery ? elem[0] : elem , this ); @@ -148,17 +151,17 @@ jQuery.fn = jQuery.prototype = { attr: function( name, value, type ) { var options = name; - + // Look for the case where we're accessing a style value if ( name.constructor == String ) - if ( value == undefined ) - return this.length && jQuery[ type || "attr" ]( this[0], name ) || undefined; + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); else { options = {}; options[ name ] = value; } - + // Check to see if we're setting style values return this.each(function(i){ // Set all the styles @@ -241,7 +244,7 @@ jQuery.fn = jQuery.prototype = { this.insertBefore( elem, this.firstChild ); }); }, - + before: function() { return this.domManip(arguments, false, false, function(elem){ this.parentNode.insertBefore( elem, this ); @@ -276,8 +279,8 @@ jQuery.fn = jQuery.prototype = { // using cloneNode. Calling detachEvent on the // clone will also remove the events from the orignal // In order to get around this, we use innerHTML. - // Unfortunately, this means some modifications to - // attributes in IE that are actually only stored + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored // as properties will not be copied (such as the // the name attribute on an input). var clone = this.cloneNode(true), @@ -295,7 +298,7 @@ jQuery.fn = jQuery.prototype = { if ( this[ expando ] != undefined ) this[ expando ] = null; }); - + // Copy the events from the original to the clone if ( events === true ) this.find("*").andSelf().each(function(i){ @@ -337,12 +340,12 @@ jQuery.fn = jQuery.prototype = { }, add: function( selector ) { - return !selector ? this : this.pushStack( jQuery.merge( + return this.pushStack( jQuery.unique( jQuery.merge( this.get(), - selector.constructor == String ? - jQuery( selector ).get() : - selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ? - selector : [selector] ) ); + typeof selector == 'string' ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); }, is: function( selector ) { @@ -352,7 +355,7 @@ jQuery.fn = jQuery.prototype = { hasClass: function( selector ) { return this.is( "." + selector ); }, - + val: function( value ) { if ( value == undefined ) { @@ -365,7 +368,7 @@ jQuery.fn = jQuery.prototype = { values = [], options = elem.options, one = elem.type == "select-one"; - + // Nothing was selected if ( index < 0 ) return null; @@ -377,18 +380,18 @@ jQuery.fn = jQuery.prototype = { if ( option.selected ) { // Get the specifc value for the option value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value; - + // We don't need an array for one selects if ( one ) return value; - + // Multi-Selects return an array values.push( value ); } } - + return values; - + // Everything else, we just grab the value } else return (this[0].value || "").replace(/\r/g, ""); @@ -423,7 +426,7 @@ jQuery.fn = jQuery.prototype = { this.value = value; }); }, - + html: function( value ) { return value == undefined ? (this.length ? @@ -460,7 +463,7 @@ jQuery.fn = jQuery.prototype = { if ( value === undefined ) { var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - + if ( data === undefined && this.length ) data = jQuery.data( this[0], key ); @@ -478,9 +481,9 @@ jQuery.fn = jQuery.prototype = { jQuery.removeData( this, key ); }); }, - + domManip: function( args, table, reverse, callback ) { - var clone = this.length > 1, elems; + var clone = this.length > 1, elems; return this.each(function(){ if ( !elems ) { @@ -569,8 +572,8 @@ jQuery.extend = jQuery.fn.extend = function() { if ( (options = arguments[ i ]) != null ) // Extend the base object for ( var name in options ) { - var src = target[ name ], copy = options[ name ]; - + var src = target[ name ], copy = options[ name ]; + // Prevent never-ending loop if ( target === copy ) continue; @@ -608,10 +611,10 @@ jQuery.extend({ // See test/unit/core.js for details concerning this function. isFunction: function( fn ) { - return !!fn && typeof fn != "string" && !fn.nodeName && + return !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /function/i.test( fn + "" ); }, - + // check if an element is in a (or is an) XML document isXMLDoc: function( elem ) { return elem.documentElement && !elem.body || @@ -642,9 +645,9 @@ jQuery.extend({ nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); }, - + cache: {}, - + data: function( elem, name, data ) { elem = elem == window ? windowData : @@ -653,24 +656,24 @@ jQuery.extend({ var id = elem[ expando ]; // Compute a unique ID for the element - if ( !id ) + if ( !id ) id = elem[ expando ] = ++uuid; // Only generate the data cache if we're // trying to access or manipulate it if ( name && !jQuery.cache[ id ] ) jQuery.cache[ id ] = {}; - + // Prevent overriding the named cache with undefined values if ( data !== undefined ) jQuery.cache[ id ][ name ] = data; - - // Return the named cache data, or the ID for the element + + // Return the named cache data, or the ID for the element return name ? jQuery.cache[ id ][ name ] : id; }, - + removeData: function( elem, name ) { elem = elem == window ? windowData : @@ -714,7 +717,7 @@ jQuery.extend({ // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length; - + if ( args ) { if ( length == undefined ) { for ( name in object ) @@ -732,18 +735,18 @@ jQuery.extend({ if ( callback.call( object[ name ], name, object[ name ] ) === false ) break; } else - for ( var value = object[0]; + for ( var value = object[0]; i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} } return object; }, - + prop: function( elem, value, type, i, name ) { // Handle executable functions if ( jQuery.isFunction( value ) ) value = value.call( elem, i ); - + // Handle passing in a number to a CSS property return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ? value + "px" : @@ -764,7 +767,7 @@ jQuery.extend({ if (elem.nodeType == 1) elem.className = classNames != undefined ? jQuery.grep(elem.className.split(/\s+/), function(className){ - return !jQuery.className.has( classNames, className ); + return !jQuery.className.has( classNames, className ); }).join(" ") : ""; }, @@ -794,7 +797,7 @@ jQuery.extend({ css: function( elem, name, force ) { if ( name == "width" || name == "height" ) { var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; - + function getWH() { val = name == "width" ? elem.offsetWidth : elem.offsetHeight; var padding = 0, border = 0; @@ -804,15 +807,15 @@ jQuery.extend({ }); val -= Math.round(padding + border); } - + if ( jQuery(elem).is(":visible") ) getWH(); else jQuery.swap( elem, props, getWH ); - + return Math.max(0, val); } - + return jQuery.curCSS( elem, name, force ); }, @@ -823,7 +826,7 @@ jQuery.extend({ function color( elem ) { if ( !jQuery.browser.safari ) return false; - + // getComputedStyle is cached var ret = getComputedStyle( elem, null ); return !ret || ret.getPropertyValue("color") == ""; @@ -843,7 +846,7 @@ jQuery.extend({ style.outline = "0 solid black"; style.outline = save; } - + // Make sure we're using the right name for getting the float value if ( name.match( /float/i ) ) name = styleFloat; @@ -926,12 +929,12 @@ jQuery.extend({ return ret; }, - + clean: function( elems, context ) { var ret = []; context = context || document; // !context.createElement fails in IE with an error but returns typeof 'object' - if (typeof context.createElement == 'undefined') + if (typeof context.createElement == 'undefined') context = context.ownerDocument || context[0] && context[0].ownerDocument || document; jQuery.each(elems, function(i, elem){ @@ -940,7 +943,7 @@ jQuery.extend({ if ( elem.constructor == Number ) elem += ''; - + // Convert html string into DOM nodes if ( typeof elem == "string" ) { // Fix "XHTML"-style tags in all browsers @@ -957,58 +960,58 @@ jQuery.extend({ // option or optgroup !tags.indexOf("", "" ] || - + !tags.indexOf("", "" ] || - + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && [ 1, "", "
" ] || - + !tags.indexOf("", "" ] || - + // matched above (!tags.indexOf("", "" ] || - + !tags.indexOf("", "" ] || // IE can't serialize and