X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=59a89d2d29506ffda41c181cbc7819a8c6795b7b;hb=ae6655bcb6d852b79df2ddc5545832c5d08936f4;hp=07666d928ed37723577337aec42af4b54e764176;hpb=54d965ffa50fcc308721d370f952251d3da3e017;p=jquery.git diff --git a/src/core.js b/src/core.js index 07666d9..59a89d2 100644 --- a/src/core.js +++ b/src/core.js @@ -56,7 +56,7 @@ var jQuery = function( selector, context ) { // For matching the engine and version of the browser browserMatch, - + // Has the ready events already been bound? readyBound = false, @@ -73,12 +73,9 @@ var jQuery = function( selector, context ) { slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, - + // [[Class]] -> type pairs - class2type = {}, - - // Marker for deferred - promiseMarker = []; + class2type = {}; jQuery.fn = jQuery.prototype = { init: function( selector, context ) { @@ -95,7 +92,7 @@ jQuery.fn = jQuery.prototype = { this.length = 1; return this; } - + // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; @@ -134,9 +131,9 @@ jQuery.fn = jQuery.prototype = { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; } - + return jQuery.merge( this, selector ); - + // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); @@ -229,7 +226,7 @@ jQuery.fn = jQuery.prototype = { if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); - + } else { jQuery.merge( ret, elems ); } @@ -261,9 +258,9 @@ jQuery.fn = jQuery.prototype = { jQuery.bindReady(); // Change ready & apply - return ( jQuery.fn.ready = readyList.then ).apply( this , arguments ); + return ( jQuery.fn.ready = readyList.complete ).apply( this , arguments ); }, - + eq: function( i ) { return i === -1 ? this.slice( i ) : @@ -288,7 +285,7 @@ jQuery.fn = jQuery.prototype = { return callback.call( elem, i, elem ); })); }, - + end: function() { return this.prevObject || jQuery(null); }, @@ -377,14 +374,14 @@ jQuery.extend({ return jQuery; }, - + // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, - + // Handle when the DOM is ready ready: function( wait ) { // A third-party is pushing the ready event forwards @@ -416,7 +413,7 @@ jQuery.extend({ } } }, - + bindReady: function() { if ( readyBound ) { return; @@ -435,7 +432,7 @@ jQuery.extend({ if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - + // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); @@ -444,7 +441,7 @@ jQuery.extend({ // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent("onreadystatechange", DOMContentLoaded); - + // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); @@ -495,20 +492,20 @@ jQuery.extend({ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } - + // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } - + // 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 ) {} - + return key === undefined || hasOwn.call( obj, key ); }, @@ -518,11 +515,11 @@ jQuery.extend({ } return true; }, - + error: function( msg ) { throw msg; }, - + parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; @@ -530,7 +527,7 @@ jQuery.extend({ // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); - + // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test(data.replace(rvalidescape, "@") @@ -694,7 +691,7 @@ jQuery.extend({ for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } - + } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; @@ -775,7 +772,7 @@ jQuery.extend({ // The value/s can be optionally by executed if its a function access: function( elems, key, value, exec, fn, pass ) { var length = elems.length; - + // Setting many attributes if ( typeof key === "object" ) { for ( var k in key ) { @@ -783,19 +780,19 @@ jQuery.extend({ } return elems; } - + // Setting one attribute if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = !pass && exec && jQuery.isFunction(value); - + for ( var i = 0; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } - + return elems; } - + // Getting an attribute return length ? fn( elems[0], key ) : undefined; }, @@ -818,8 +815,8 @@ jQuery.extend({ // the deferred itself deferred = { - // then( f1, f2, ...) - then: function () { + // complete( f1, f2, ...) + complete: function () { if ( ! cancelled ) { @@ -839,7 +836,7 @@ jQuery.extend({ elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { - deferred.then.apply( deferred , elem ); + deferred.complete.apply( deferred , elem ); } else if ( type === "function" ) { callbacks.push( elem ); } @@ -874,7 +871,7 @@ jQuery.extend({ // resolve with this as context and given arguments resolve: function() { - deferred.fire( this , arguments ); + deferred.fire( jQuery.isFunction( this.promise ) ? this.promise() : this , arguments ); return this; }, @@ -888,11 +885,6 @@ jQuery.extend({ cancelled = 1; callbacks = []; return this; - }, - - // Has this deferred been cancelled? - isCancelled: function() { - return !!cancelled; } }; @@ -903,38 +895,40 @@ jQuery.extend({ // Typical success/error system Deferred: function( func ) { - var errorDeferred = jQuery._Deferred(), - deferred = jQuery._Deferred(), - successCancel = deferred.cancel; + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(); // Add errorDeferred methods and redefine cancel jQuery.extend( deferred , { - fail: errorDeferred.then, - fireReject: errorDeferred.fire, - reject: errorDeferred.resolve, - isRejected: errorDeferred.isResolved, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - obj = obj || {}; - for ( var i in { then:1 , fail:1 , isResolved:1 , isRejected:1 , promise:1 } ) { - obj[ i ] = deferred[ i ]; - } + then: function( completeCallbacks , failCallbacks ) { + deferred.complete( completeCallbacks ).fail( failCallbacks ); + return this; + }, + fail: failDeferred.complete, + fireReject: failDeferred.fire, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + obj = obj || {}; + jQuery.each( "then complete fail isResolved isRejected".split( " " ) , function( _ , method ) { + obj[ method ] = deferred[ method ]; + }); + obj.promise = function() { return obj; - } + }; + return obj; + } } ); - // Remove cancel related - delete deferred.cancel; - delete deferred.isCancelled; - - // Add promise marker - deferred.promise._ = promiseMarker; - // Make sure only one callback list will be used - deferred.then( errorDeferred.cancel ).fail( successCancel ); + deferred.then( failDeferred.cancel , deferred.cancel ); + + // Unexpose cancel + delete deferred.cancel; // Call given func if any if ( func ) { @@ -946,7 +940,7 @@ jQuery.extend({ // Deferred helper when: function( object ) { - object = object && object.promise && object.promise._ === promiseMarker ? + object = object && jQuery.isFunction( object.promise ) ? object : jQuery.Deferred().resolve( object ); return object.promise(); @@ -1040,11 +1034,6 @@ function doScrollCheck() { jQuery.ready(); } -// Expose jQuery as an Asynchronous Module -if ( typeof define !== "undefined" ) { - define( "jquery", [], function () { return jQuery; } ); -} - // Expose jQuery to the global object return (window.jQuery = window.$ = jQuery);