// The deferred used on DOM ready
readyList,
- // Promise methods
- promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
+ // Promise methods (with equivalent for invert)
+ promiseMethods = {
+ then: 0, // will be overwritten for invert
+ done: "fail",
+ fail: "done",
+ isResolved: "isRejected",
+ isRejected: "isResolved",
+ promise: "invert",
+ invert: "promise"
+ },
// The ready event handler
DOMContentLoaded,
if ( data && rnotwhite.test(data) ) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
- var head = document.getElementsByTagName("head")[0] || document.documentElement,
- script = document.createElement("script");
-
- script.type = "text/javascript";
+ var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement,
+ script = document.createElement( "script" );
if ( jQuery.support.scriptEval() ) {
script.appendChild( document.createTextNode( data ) );
Deferred: function( func ) {
var deferred = jQuery._Deferred(),
failDeferred = jQuery._Deferred(),
- promise;
- // Add errorDeferred methods, then and promise
+ promise,
+ invert;
+ // Add errorDeferred methods, then, promise and invert
jQuery.extend( deferred, {
then: function( doneCallbacks, failCallbacks ) {
deferred.done( doneCallbacks ).fail( failCallbacks );
isRejected: failDeferred.isResolved,
// Get a promise for this deferred
// If obj is provided, the promise aspect is added to the object
- promise: function( obj , i /* internal */ ) {
+ promise: function( obj ) {
if ( obj == null ) {
if ( promise ) {
return promise;
}
promise = obj = {};
}
- i = promiseMethods.length;
- while( i-- ) {
- obj[ promiseMethods[ i ] ] = deferred[ promiseMethods[ i ] ];
+ for( var methodName in promiseMethods ) {
+ obj[ methodName ] = deferred[ methodName ];
+ }
+ return obj;
+ },
+ // Get the invert promise for this deferred
+ // If obj is provided, the invert promise aspect is added to the object
+ invert: function( obj ) {
+ if ( obj == null ) {
+ if ( invert ) {
+ return invert;
+ }
+ invert = obj = {};
+ }
+ for( var methodName in promiseMethods ) {
+ obj[ methodName ] = promiseMethods[ methodName ] && deferred[ promiseMethods[methodName] ];
}
+ obj.then = invert.then || function( doneCallbacks, failCallbacks ) {
+ deferred.done( failCallbacks ).fail( doneCallbacks );
+ return this;
+ };
return obj;
}
} );
if ( length > 1 ) {
resolveArray = new Array( length );
- jQuery.each( args, function( index, element, args ) {
+ jQuery.each( args, function( index, element ) {
jQuery.when( element ).then( function( value ) {
- args = arguments;
- resolveArray[ index ] = args.length > 1 ? slice.call( args, 0 ) : value;
+ resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
if( ! --length ) {
deferred.resolveWith( promise, resolveArray );
}
return { browser: match[1] || "", version: match[2] || "0" };
},
- subclass: function(){
+ sub: function() {
function jQuerySubclass( selector, context ) {
return new jQuerySubclass.fn.init( selector, context );
}
+ jQuery.extend( true, jQuerySubclass, this );
jQuerySubclass.superclass = this;
jQuerySubclass.fn = jQuerySubclass.prototype = this();
jQuerySubclass.fn.constructor = jQuerySubclass;
jQuerySubclass.subclass = this.subclass;
jQuerySubclass.fn.init = function init( selector, context ) {
- if (context && context instanceof jQuery && !(context instanceof jQuerySubclass)){
+ if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
context = jQuerySubclass(context);
}
+
return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
};
jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;