X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=d77c818e63131af78aa55460714a19eadedcaa08;hb=3663836b0180f3a73d96ec234d5d7010e5652a4b;hp=915ac6ba4502628c2005f47a0174fb3a281bfe57;hpb=4e975430510f443ef76a90d077bc8956fb8b8cc0;p=jquery.git diff --git a/src/core.js b/src/core.js index 915ac6b..d77c818 100644 --- a/src/core.js +++ b/src/core.js @@ -56,16 +56,8 @@ var jQuery = function( selector, context ) { // The deferred used on DOM ready readyList, - // 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" - }, + // Promise methods + promiseMethods = "then done fail isResolved isRejected promise".split( " " ), // The ready event handler DOMContentLoaded, @@ -302,7 +294,7 @@ jQuery.fn = jQuery.prototype = { jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, + var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, @@ -574,10 +566,8 @@ jQuery.extend({ 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 ) ); @@ -853,6 +843,12 @@ jQuery.extend({ callbacks.shift().apply( context, args ); } } + // We have to add a catch block for + // IE prior to 8 or else the finally + // block will never get executed + catch (e) { + throw e; + } finally { fired = [ context, args ]; firing = 0; @@ -887,9 +883,8 @@ jQuery.extend({ Deferred: function( func ) { var deferred = jQuery._Deferred(), failDeferred = jQuery._Deferred(), - promise, - invert; - // Add errorDeferred methods, then, promise and invert + promise; + // Add errorDeferred methods, then and promise jQuery.extend( deferred, { then: function( doneCallbacks, failCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ); @@ -908,32 +903,15 @@ jQuery.extend({ } promise = obj = {}; } - 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] ]; + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; } - obj.then = invert.then || function( doneCallbacks, failCallbacks ) { - deferred.done( failCallbacks ).fail( doneCallbacks ); - return this; - }; return obj; } } ); // Make sure only one callback list will be used - deferred.then( failDeferred.cancel, deferred.cancel ); + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); // Unexpose cancel delete deferred.cancel; // Call given func if any @@ -945,24 +923,34 @@ jQuery.extend({ // Deferred helper when: function( object ) { - var args = arguments, - length = args.length, - deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ? + var lastIndex = arguments.length, + deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ? object : jQuery.Deferred(), - promise = deferred.promise(), - resolveArray; - - if ( length > 1 ) { - resolveArray = new Array( length ); - jQuery.each( args, function( index, element ) { - jQuery.when( element ).then( function( value ) { - resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; - if( ! --length ) { - deferred.resolveWith( promise, resolveArray ); - } - }, deferred.reject ); - } ); + promise = deferred.promise(); + + if ( lastIndex > 1 ) { + var array = slice.call( arguments, 0 ), + count = lastIndex, + iCallback = function( index ) { + return function( value ) { + array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( promise, array ); + } + }; + }; + while( ( lastIndex-- ) ) { + object = array[ lastIndex ]; + if ( object && jQuery.isFunction( object.promise ) ) { + object.promise().then( iCallback(lastIndex), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( promise, array ); + } } else if ( deferred !== object ) { deferred.resolve( object ); } @@ -1078,6 +1066,6 @@ function doScrollCheck() { } // Expose jQuery to the global object -return (window.jQuery = window.$ = jQuery); +return jQuery; })();