X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fcore.js;h=07666d928ed37723577337aec42af4b54e764176;hb=54d965ffa50fcc308721d370f952251d3da3e017;hp=39d49743c0c9436c35834c730c70c39487ed3db1;hpb=9e3f053c6568863251da20eba713d05f2bbdf9f0;p=jquery.git diff --git a/src/core.js b/src/core.js index 39d4974..07666d9 100644 --- a/src/core.js +++ b/src/core.js @@ -78,7 +78,7 @@ var jQuery = function( selector, context ) { class2type = {}, // Marker for deferred - deferredMarker = []; + promiseMarker = []; jQuery.fn = jQuery.prototype = { init: function( selector, context ) { @@ -546,6 +546,28 @@ jQuery.extend({ jQuery.error( "Invalid JSON: " + data ); } }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, noop: function() {}, @@ -783,10 +805,7 @@ jQuery.extend({ }, // Create a simple deferred (one callbacks list) - _deferred: function( cancellable ) { - - // cancellable by default - cancellable = cancellable !== false; + _Deferred: function() { var // callbacks list callbacks = [], @@ -800,10 +819,10 @@ jQuery.extend({ deferred = { // then( f1, f2, ...) - then: function then() { + then: function () { if ( ! cancelled ) { - + var args = arguments, i, length, @@ -820,7 +839,7 @@ jQuery.extend({ elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { - then.apply( this , elem ); + deferred.then.apply( deferred , elem ); } else if ( type === "function" ) { callbacks.push( elem ); } @@ -830,24 +849,23 @@ jQuery.extend({ deferred.fire( _fired[ 0 ] , _fired[ 1 ] ); } } + return this; }, // resolve with given context and args - // (i is used internally) - fire: function( context , args , i ) { + fire: function( context , args ) { if ( ! cancelled && ! fired && ! firing ) { + firing = 1; + try { - for( i = 0 ; ! cancelled && callbacks[ i ] ; i++ ) { - cancelled = ( callbacks[ i ].apply( context , args ) === false ) && cancellable; + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context , args ); } - } catch( e ) { - cancelled = cancellable; - jQuery.error( e ); - } finally { + } + finally { fired = [ context , args ]; - callbacks = cancelled ? [] : callbacks.slice( i + 1 ); firing = 0; } } @@ -860,40 +878,34 @@ jQuery.extend({ return this; }, - // cancelling further callbacks + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel cancel: function() { - if ( cancellable ) { - callbacks = []; - cancelled = 1; - } + cancelled = 1; + callbacks = []; return this; - } + }, + // Has this deferred been cancelled? + isCancelled: function() { + return !!cancelled; + } }; - // Add the deferred marker - deferred.then._ = deferredMarker; - return deferred; }, // Full fledged deferred (two callbacks list) // Typical success/error system - deferred: function( func , cancellable ) { + Deferred: function( func ) { - // Handle varargs - if ( arguments.length === 1 ) { - - if ( typeof func === "boolean" ) { - cancellable = func; - func = 0; - } - } - - var errorDeferred = jQuery._deferred( cancellable ), - deferred = jQuery._deferred( cancellable ), - // Keep reference of the cancel method since we'll redefine it - cancelThen = deferred.cancel; + var errorDeferred = jQuery._Deferred(), + deferred = jQuery._Deferred(), + successCancel = deferred.cancel; // Add errorDeferred methods and redefine cancel jQuery.extend( deferred , { @@ -901,16 +913,28 @@ jQuery.extend({ fail: errorDeferred.then, fireReject: errorDeferred.fire, reject: errorDeferred.resolve, - cancel: function() { - cancelThen(); - errorDeferred.cancel(); - return this; + 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 ]; + } + 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( cancelThen ); + deferred.then( errorDeferred.cancel ).fail( successCancel ); // Call given func if any if ( func ) { @@ -920,22 +944,12 @@ jQuery.extend({ return deferred; }, - // Check if an object is a deferred - isDeferred: function( object , method ) { - method = method || "then"; - return !!( object && object[ method ] && object[ method ]._ === deferredMarker ); - }, - // Deferred helper - when: function( object , method ) { - method = method || "then"; - object = jQuery.isDeferred( object , method ) ? + when: function( object ) { + object = object && object.promise && object.promise._ === promiseMarker ? object : - jQuery.deferred().resolve( object ); - object.fail = object.fail || function() { return this; }; - object[ method ] = object[ method ] || object.then; - object.then = object.then || object[ method ]; - return object; + jQuery.Deferred().resolve( object ); + return object.promise(); }, // Use of jQuery.browser is frowned upon. @@ -956,9 +970,7 @@ jQuery.extend({ }); // Create readyList deferred -// also force $.fn.ready to be recognized as a defer -readyList = jQuery._deferred( false ); -jQuery.fn.ready._ = deferredMarker; +readyList = jQuery._Deferred(); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { @@ -1028,6 +1040,11 @@ 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);