| define( [ |
| "./core", |
| "./data/var/dataPriv", |
| "./deferred", |
| "./callbacks" |
| ], function( jQuery, dataPriv ) { |
| |
| "use strict"; |
| |
| jQuery.extend( { |
| queue: function( elem, type, data ) { |
| var queue; |
| |
| if ( elem ) { |
| type = ( type || "fx" ) + "queue"; |
| queue = dataPriv.get( elem, type ); |
| |
| // Speed up dequeue by getting out quickly if this is just a lookup |
| if ( data ) { |
| if ( !queue || Array.isArray( data ) ) { |
| queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); |
| } else { |
| queue.push( data ); |
| } |
| } |
| return queue || []; |
| } |
| }, |
| |
| dequeue: function( elem, type ) { |
| type = type || "fx"; |
| |
| var queue = jQuery.queue( elem, type ), |
| startLength = queue.length, |
| fn = queue.shift(), |
| hooks = jQuery._queueHooks( elem, type ), |
| next = function() { |
| jQuery.dequeue( elem, type ); |
| }; |
| |
| // If the fx queue is dequeued, always remove the progress sentinel |
| if ( fn === "inprogress" ) { |
| fn = queue.shift(); |
| startLength--; |
| } |
| |
| if ( fn ) { |
| |
| // Add a progress sentinel to prevent the fx queue from being |
| // automatically dequeued |
| if ( type === "fx" ) { |
| queue.unshift( "inprogress" ); |
| } |
| |
| // Clear up the last queue stop function |
| delete hooks.stop; |
| fn.call( elem, next, hooks ); |
| } |
| |
| if ( !startLength && hooks ) { |
| hooks.empty.fire(); |
| } |
| }, |
| |
| // Not public - generate a queueHooks object, or return the current one |
| _queueHooks: function( elem, type ) { |
| var key = type + "queueHooks"; |
| return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { |
| empty: jQuery.Callbacks( "once memory" ).add( function() { |
| dataPriv.remove( elem, [ type + "queue", key ] ); |
| } ) |
| } ); |
| } |
| } ); |
| |
| jQuery.fn.extend( { |
| queue: function( type, data ) { |
| var setter = 2; |
| |
| if ( typeof type !== "string" ) { |
| data = type; |
| type = "fx"; |
| setter--; |
| } |
| |
| if ( arguments.length < setter ) { |
| return jQuery.queue( this[ 0 ], type ); |
| } |
| |
| return data === undefined ? |
| this : |
| this.each( function() { |
| var queue = jQuery.queue( this, type, data ); |
| |
| // Ensure a hooks for this queue |
| jQuery._queueHooks( this, type ); |
| |
| if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { |
| jQuery.dequeue( this, type ); |
| } |
| } ); |
| }, |
| dequeue: function( type ) { |
| return this.each( function() { |
| jQuery.dequeue( this, type ); |
| } ); |
| }, |
| clearQueue: function( type ) { |
| return this.queue( type || "fx", [] ); |
| }, |
| |
| // Get a promise resolved when queues of a certain type |
| // are emptied (fx is the type by default) |
| promise: function( type, obj ) { |
| var tmp, |
| count = 1, |
| defer = jQuery.Deferred(), |
| elements = this, |
| i = this.length, |
| resolve = function() { |
| if ( !( --count ) ) { |
| defer.resolveWith( elements, [ elements ] ); |
| } |
| }; |
| |
| if ( typeof type !== "string" ) { |
| obj = type; |
| type = undefined; |
| } |
| type = type || "fx"; |
| |
| while ( i-- ) { |
| tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); |
| if ( tmp && tmp.empty ) { |
| count++; |
| tmp.empty.add( resolve ); |
| } |
| } |
| resolve(); |
| return defer.promise( obj ); |
| } |
| } ); |
| |
| return jQuery; |
| } ); |