/instantMessage/node_modules/jquery/src/callbacks.js |
@@ -0,0 +1,236 @@ |
define( [ |
"./core", |
"./core/toType", |
"./var/isFunction", |
"./var/rnothtmlwhite" |
], function( jQuery, toType, isFunction, rnothtmlwhite ) { |
|
"use strict"; |
|
// Convert String-formatted options into Object-formatted ones |
function createOptions( options ) { |
var object = {}; |
jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { |
object[ flag ] = true; |
} ); |
return object; |
} |
|
/* |
* Create a callback list using the following parameters: |
* |
* options: an optional list of space-separated options that will change how |
* the callback list behaves or a more traditional option object |
* |
* By default a callback list will act like an event callback list and can be |
* "fired" multiple times. |
* |
* Possible options: |
* |
* once: will ensure the callback list can only be fired once (like a Deferred) |
* |
* memory: will keep track of previous values and will call any callback added |
* after the list has been fired right away with the latest "memorized" |
* values (like a Deferred) |
* |
* unique: will ensure a callback can only be added once (no duplicate in the list) |
* |
* stopOnFalse: interrupt callings when a callback returns false |
* |
*/ |
jQuery.Callbacks = function( options ) { |
|
// Convert options from String-formatted to Object-formatted if needed |
// (we check in cache first) |
options = typeof options === "string" ? |
createOptions( options ) : |
jQuery.extend( {}, options ); |
|
var // Flag to know if list is currently firing |
firing, |
|
// Last fire value for non-forgettable lists |
memory, |
|
// Flag to know if list was already fired |
fired, |
|
// Flag to prevent firing |
locked, |
|
// Actual callback list |
list = [], |
|
// Queue of execution data for repeatable lists |
queue = [], |
|
// Index of currently firing callback (modified by add/remove as needed) |
firingIndex = -1, |
|
// Fire callbacks |
fire = function() { |
|
// Enforce single-firing |
locked = locked || options.once; |
|
// Execute callbacks for all pending executions, |
// respecting firingIndex overrides and runtime changes |
fired = firing = true; |
for ( ; queue.length; firingIndex = -1 ) { |
memory = queue.shift(); |
while ( ++firingIndex < list.length ) { |
|
// Run callback and check for early termination |
if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && |
options.stopOnFalse ) { |
|
// Jump to end and forget the data so .add doesn't re-fire |
firingIndex = list.length; |
memory = false; |
} |
} |
} |
|
// Forget the data if we're done with it |
if ( !options.memory ) { |
memory = false; |
} |
|
firing = false; |
|
// Clean up if we're done firing for good |
if ( locked ) { |
|
// Keep an empty list if we have data for future add calls |
if ( memory ) { |
list = []; |
|
// Otherwise, this object is spent |
} else { |
list = ""; |
} |
} |
}, |
|
// Actual Callbacks object |
self = { |
|
// Add a callback or a collection of callbacks to the list |
add: function() { |
if ( list ) { |
|
// If we have memory from a past run, we should fire after adding |
if ( memory && !firing ) { |
firingIndex = list.length - 1; |
queue.push( memory ); |
} |
|
( function add( args ) { |
jQuery.each( args, function( _, arg ) { |
if ( isFunction( arg ) ) { |
if ( !options.unique || !self.has( arg ) ) { |
list.push( arg ); |
} |
} else if ( arg && arg.length && toType( arg ) !== "string" ) { |
|
// Inspect recursively |
add( arg ); |
} |
} ); |
} )( arguments ); |
|
if ( memory && !firing ) { |
fire(); |
} |
} |
return this; |
}, |
|
// Remove a callback from the list |
remove: function() { |
jQuery.each( arguments, function( _, arg ) { |
var index; |
while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { |
list.splice( index, 1 ); |
|
// Handle firing indexes |
if ( index <= firingIndex ) { |
firingIndex--; |
} |
} |
} ); |
return this; |
}, |
|
// Check if a given callback is in the list. |
// If no argument is given, return whether or not list has callbacks attached. |
has: function( fn ) { |
return fn ? |
jQuery.inArray( fn, list ) > -1 : |
list.length > 0; |
}, |
|
// Remove all callbacks from the list |
empty: function() { |
if ( list ) { |
list = []; |
} |
return this; |
}, |
|
// Disable .fire and .add |
// Abort any current/pending executions |
// Clear all callbacks and values |
disable: function() { |
locked = queue = []; |
list = memory = ""; |
return this; |
}, |
disabled: function() { |
return !list; |
}, |
|
// Disable .fire |
// Also disable .add unless we have memory (since it would have no effect) |
// Abort any pending executions |
lock: function() { |
locked = queue = []; |
if ( !memory && !firing ) { |
list = memory = ""; |
} |
return this; |
}, |
locked: function() { |
return !!locked; |
}, |
|
// Call all callbacks with the given context and arguments |
fireWith: function( context, args ) { |
if ( !locked ) { |
args = args || []; |
args = [ context, args.slice ? args.slice() : args ]; |
queue.push( args ); |
if ( !firing ) { |
fire(); |
} |
} |
return this; |
}, |
|
// Call all the callbacks with the given arguments |
fire: function() { |
self.fireWith( this, arguments ); |
return this; |
}, |
|
// To know if the callbacks have already been called at least once |
fired: function() { |
return !!fired; |
} |
}; |
|
return self; |
}; |
|
return jQuery; |
} ); |