11( function ( jQuery ) {
22
3+ function handleQueueMarkDefer ( elem , type , src ) {
4+ var deferDataKey = type + "defer" ,
5+ queueDataKey = type + "queue" ,
6+ markDataKey = type + "mark" ,
7+ defer = jQuery . data ( elem , deferDataKey , undefined , true ) ;
8+ if ( defer &&
9+ ( src === "queue" || ! jQuery . data ( elem , queueDataKey , undefined , true ) ) &&
10+ ( src === "mark " || ! jQuery . data ( elem , markDataKey , undefined , true ) ) ) {
11+ // Give room for hard-coded callbacks to fire first
12+ // and eventually mark/queue something else on the element
13+ setTimeout ( function ( ) {
14+ if ( ! jQuery . data ( elem , queueDataKey , undefined , true ) &&
15+ ! jQuery . data ( elem , markDataKey , undefined , true ) ) {
16+ jQuery . removeData ( elem , deferDataKey , true ) ;
17+ defer . resolve ( ) ;
18+ }
19+ } , 0 ) ;
20+ }
21+ }
22+
323jQuery . extend ( {
4- queue : function ( elem , type , data ) {
5- if ( ! elem ) {
6- return ;
7- }
824
9- type = ( type || "fx" ) + "queue" ;
10- var q = jQuery . _data ( elem , type ) ;
25+ _mark : function ( elem , type ) {
26+ if ( elem ) {
27+ type = ( type || "fx" ) + "mark" ;
28+ jQuery . data ( elem , type , ( jQuery . data ( elem , type , undefined , true ) || 0 ) + 1 , true ) ;
29+ }
30+ } ,
1131
12- // Speed up dequeue by getting out quickly if this is just a lookup
13- if ( ! data ) {
14- return q || [ ] ;
32+ _unmark : function ( force , elem , type ) {
33+ if ( force !== true ) {
34+ type = elem ;
35+ elem = force ;
36+ force = false ;
1537 }
1638
17- if ( ! q || jQuery . isArray ( data ) ) {
18- q = jQuery . _data ( elem , type , jQuery . makeArray ( data ) ) ;
39+ if ( elem ) {
40+ type = type || "fx" ;
41+
42+ var key = type + "mark" ,
43+ count = force ? 0 : ( ( jQuery . data ( elem , key , undefined , true ) || 1 ) - 1 ) ;
1944
20- } else {
21- q . push ( data ) ;
45+ if ( count ) {
46+ jQuery . data ( elem , key , count , true ) ;
47+ } else {
48+ jQuery . removeData ( elem , key , true ) ;
49+ handleQueueMarkDefer ( elem , type , "mark" ) ;
50+ }
2251 }
52+ } ,
2353
24- return q ;
54+ queue : function ( elem , type , data ) {
55+ if ( elem ) {
56+ type = ( type || "fx" ) + "queue" ;
57+ var q = jQuery . data ( elem , type , undefined , true ) || [ ] ;
58+
59+ // Speed up dequeue by getting out quickly if this is just a lookup
60+ if ( data ) {
61+ if ( ! q . length || jQuery . isArray ( data ) ) {
62+ q = jQuery . data ( elem , type , jQuery . makeArray ( data ) , true ) ;
63+ } else {
64+ q . push ( data ) ;
65+ }
66+ }
67+ return q ;
68+ }
2569 } ,
2670
2771 dequeue : function ( elem , type ) {
28- type = type || "fx" ;
29-
3072 var queue = jQuery . queue ( elem , type ) ,
3173 fn = queue . shift ( ) ,
3274 defer ;
@@ -50,17 +92,7 @@ jQuery.extend({
5092
5193 if ( ! queue . length ) {
5294 jQuery . removeData ( elem , type + "queue" , true ) ;
53- // Look if we have observers and resolve if needed
54- if ( ( defer = jQuery . data ( elem , type + "defer" , undefined , true ) ) ) {
55- // Give room for hard-coded callbacks to fire first
56- // and eventually add another animation on the element
57- setTimeout ( function ( ) {
58- if ( ! jQuery . data ( elem , type + "queue" , undefined , true ) ) {
59- jQuery . removeData ( elem , type + "defer" , true ) ;
60- defer . resolve ( ) ;
61- }
62- } , 0 ) ;
63- }
95+ handleQueueMarkDefer ( elem , type , "queue" ) ;
6496 }
6597 }
6698} ) ;
@@ -120,15 +152,17 @@ jQuery.fn.extend({
120152 i = elements . length ,
121153 count = 1 ,
122154 deferDataKey = type + "defer" ,
123- queueDataKey = type + "queue" ;
155+ queueDataKey = type + "queue" ,
156+ markDataKey = type + "mark" ;
124157 function resolve ( ) {
125158 if ( ! ( -- count ) ) {
126159 defer . resolveWith ( elements , [ elements ] ) ;
127160 }
128161 }
129162 while ( i -- ) {
130163 if ( ( tmp = jQuery . data ( elements [ i ] , deferDataKey , undefined , true ) ||
131- jQuery . data ( elements [ i ] , queueDataKey , undefined , true ) &&
164+ ( jQuery . data ( elements [ i ] , queueDataKey , undefined , true ) ||
165+ jQuery . data ( elements [ i ] , markDataKey , undefined , true ) ) &&
132166 jQuery . data ( elements [ i ] , deferDataKey , jQuery . _Deferred ( ) , true ) ) ) {
133167 count ++ ;
134168 tmp . done ( resolve ) ;
0 commit comments