X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=944e8a9bf7ec8c06089ea4cb8a3f7175fc022cf3;hb=7b0b348419c85841671459b4d7153afc88d1fa83;hp=4c7b07eca87226591d2c87de4e75ab8f2e65911f;hpb=715d1c5a30cc4986018bbf063713f14c34c3e258;p=jquery.git diff --git a/src/core.js b/src/core.js index 4c7b07e..944e8a9 100644 --- a/src/core.js +++ b/src/core.js @@ -41,6 +41,9 @@ var jQuery = function( selector, context ) { // The functions to execute on DOM ready readyList = [], + // The ready event handler + DOMContentLoaded, + // Save a reference to some core methods toString = Object.prototype.toString, hasOwnProperty = Object.prototype.hasOwnProperty, @@ -81,7 +84,13 @@ jQuery.fn = jQuery.prototype = { ret = rsingleTag.exec( selector ); if ( ret ) { - selector = [ doc.createElement( ret[1] ) ]; + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } } else { ret = buildFragment( [ match[1] ], [ doc ] ); @@ -155,7 +164,7 @@ jQuery.fn = jQuery.prototype = { return this.length; }, - toArray: function(){ + toArray: function() { return slice.call( this, 0 ); }, @@ -210,43 +219,53 @@ jQuery.fn = jQuery.prototype = { each: function( callback, args ) { return jQuery.each( this, callback, args ); }, - - // 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.jquery ? elem[0] : elem, this ); - }, - - is: function( selector ) { - return !!selector && jQuery.filter( selector, this ).length > 0; - }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // If the DOM is already ready - if ( jQuery.isReady && !readyList ) { + if ( jQuery.isReady ) { // Execute the function immediately fn.call( document, jQuery ); // Otherwise, remember the function for later - } else { + } else if ( readyList ) { // Add the function to the wait list readyList.push( fn ); } return this; }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || jQuery(null); + }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. @@ -332,6 +351,7 @@ jQuery.extend({ ready: function() { // Make sure that the DOM is not already loaded if ( !jQuery.isReady ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 13 ); } @@ -359,7 +379,10 @@ jQuery.extend({ }, bindReady: function() { - if ( readyBound ) { return; } + if ( readyBound ) { + return; + } + readyBound = true; // Catch cases where $(document).ready() is called after the @@ -371,10 +394,7 @@ jQuery.extend({ // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback - document.addEventListener( "DOMContentLoaded", function DOMContentLoaded() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }, false ); + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); @@ -383,13 +403,7 @@ jQuery.extend({ } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes - document.attachEvent("onreadystatechange", function onreadystatechange() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", onreadystatechange ); - jQuery.ready(); - } - }); + document.attachEvent("onreadystatechange", DOMContentLoaded); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); @@ -400,28 +414,10 @@ jQuery.extend({ try { toplevel = window.frameElement == null; - } catch(e){} + } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); - - function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch( error ) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); - } } } }, @@ -438,19 +434,22 @@ jQuery.extend({ }, isPlainObject: function( obj ) { - if ( toString.call(obj) !== "[object Object]" || typeof obj.nodeType === "number" ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { return false; } - // not own constructor property must be Object + // Not own constructor property must be Object if ( obj.constructor && !hasOwnProperty.call(obj, "constructor") && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } - //own properties are iterated firstly, - //so to speed up, we can test last one if it is own or not + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. var key; for ( key in obj ) {} @@ -618,7 +617,7 @@ jQuery.extend({ // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser browser: { - version: (/.*?(?:firefox|safari|opera|msie)[\/ ]([\d.]+)/.exec(userAgent) || [0,'0'])[1], + version: (/.*?(?:firefox|safari|opera|msie)[\/ ]([\d.]+)/.exec(userAgent) || [0,"0"])[1], safari: /safari/.test( userAgent ), opera: /opera/.test( userAgent ), msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), @@ -638,6 +637,48 @@ if ( indexOf ) { // All jQuery objects should point back to these rootjQuery = jQuery(document); +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch( error ) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + function evalScript( i, elem ) { if ( elem.src ) { jQuery.ajax({ @@ -656,32 +697,31 @@ function evalScript( i, elem ) { // Mutifunctional method to get and set values to a collection // The value/s can be optionally by executed if its a function -function access( elems, key, value, exec, fn ) { - var l = elems.length; +function access( elems, key, value, exec, fn, pass ) { + var length = elems.length; // Setting many attributes if ( typeof key === "object" ) { - for (var k in key) { - access(elems, k, key[k], exec, fn); - } + for ( var k in key ) { + access( elems, k, key[k], exec, fn, value ); + } return elems; } // Setting one attribute - if (value !== undefined) { + if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = exec && jQuery.isFunction(value); - for (var i = 0; i < l; i++) { - var elem = elems[i], - val = exec ? value.call(elem, i) : value; - fn(elem, key, val); + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i ) : value, pass ); } + return elems; } // Getting an attribute - return l ? fn(elems[0], key) : null; + return length ? fn( elems[0], key ) : null; } function now() {