}\r
},\r
queue: function( elem, type, data ) {\r
- if ( elem ){\r
+ if( !elem ) return;\r
\r
- type = (type || "fx") + "queue";\r
+ type = (type || "fx") + "queue";\r
+ var q = jQuery.data( elem, type );\r
\r
- var q = jQuery.data( elem, type );\r
+ // Speed up dequeue by getting out quickly if this is just a lookup\r
+ if( !data ) return q || [];\r
\r
- if ( !q || jQuery.isArray(data) )\r
- q = jQuery.data( elem, type, jQuery.makeArray(data) );\r
- else if( data )\r
- q.push( data );\r
+ if ( !q || jQuery.isArray(data) )\r
+ q = jQuery.data( elem, type, jQuery.makeArray(data) );\r
+ else\r
+ q.push( data );\r
\r
- }\r
return q;\r
},\r
\r
dequeue: function( elem, type ){\r
- var queue = jQuery.queue( elem, type ),\r
- fn = queue.shift();\r
+ type = type || "fx";\r
+\r
+ var queue = jQuery.queue( elem, type ), fn = queue.shift();\r
\r
- if( !type || type === "fx" )\r
- fn = queue[0];\r
+ // If the fx queue is dequeued, always remove the progress sentinel\r
+ if( fn === "inprogress" ) fn = queue.shift();\r
\r
- if( fn !== undefined )\r
- fn.call(elem, function() { jQuery(elem).dequeue(type); });\r
+ if( fn ) {\r
+ // Add a progress sentinel to prevent the fx queue from being\r
+ // automatically dequeued\r
+ if( type == "fx" ) queue.unshift("inprogress");\r
+\r
+ fn.call(elem, function() { jQuery.dequeue(elem, type); });\r
+ }\r
}\r
});\r
\r
return this.each(function(i, elem){\r
var queue = jQuery.queue( this, type, data );\r
\r
- if( type == "fx" && queue.length == 1 )\r
- queue[0].call(this, function() { jQuery(elem).dequeue(type); });\r
+ if( type == "fx" && queue[0] !== "inprogress" )\r
+ jQuery.dequeue( this, type )\r
});\r
},\r
dequeue: function(type){\r