queue.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. jQuery.extend({
  2. queue: function( elem, type, data ) {
  3. var queue;
  4. if ( elem ) {
  5. type = ( type || "fx" ) + "queue";
  6. queue = data_priv.get( elem, type );
  7. // Speed up dequeue by getting out quickly if this is just a lookup
  8. if ( data ) {
  9. if ( !queue || jQuery.isArray( data ) ) {
  10. queue = data_priv.access( elem, type, jQuery.makeArray(data) );
  11. } else {
  12. queue.push( data );
  13. }
  14. }
  15. return queue || [];
  16. }
  17. },
  18. dequeue: function( elem, type ) {
  19. type = type || "fx";
  20. var queue = jQuery.queue( elem, type ),
  21. startLength = queue.length,
  22. fn = queue.shift(),
  23. hooks = jQuery._queueHooks( elem, type ),
  24. next = function() {
  25. jQuery.dequeue( elem, type );
  26. };
  27. // If the fx queue is dequeued, always remove the progress sentinel
  28. if ( fn === "inprogress" ) {
  29. fn = queue.shift();
  30. startLength--;
  31. }
  32. if ( fn ) {
  33. // Add a progress sentinel to prevent the fx queue from being
  34. // automatically dequeued
  35. if ( type === "fx" ) {
  36. queue.unshift( "inprogress" );
  37. }
  38. // clear up the last queue stop function
  39. delete hooks.stop;
  40. fn.call( elem, next, hooks );
  41. }
  42. if ( !startLength && hooks ) {
  43. hooks.empty.fire();
  44. }
  45. },
  46. // not intended for public consumption - generates a queueHooks object, or returns the current one
  47. _queueHooks: function( elem, type ) {
  48. var key = type + "queueHooks";
  49. return data_priv.get( elem, key ) || data_priv.access( elem, key, {
  50. empty: jQuery.Callbacks("once memory").add(function() {
  51. data_priv.remove( elem, [ type + "queue", key ] );
  52. })
  53. });
  54. }
  55. });
  56. jQuery.fn.extend({
  57. queue: function( type, data ) {
  58. var setter = 2;
  59. if ( typeof type !== "string" ) {
  60. data = type;
  61. type = "fx";
  62. setter--;
  63. }
  64. if ( arguments.length < setter ) {
  65. return jQuery.queue( this[0], type );
  66. }
  67. return data === undefined ?
  68. this :
  69. this.each(function() {
  70. var queue = jQuery.queue( this, type, data );
  71. // ensure a hooks for this queue
  72. jQuery._queueHooks( this, type );
  73. if ( type === "fx" && queue[0] !== "inprogress" ) {
  74. jQuery.dequeue( this, type );
  75. }
  76. });
  77. },
  78. dequeue: function( type ) {
  79. return this.each(function() {
  80. jQuery.dequeue( this, type );
  81. });
  82. },
  83. // Based off of the plugin by Clint Helfers, with permission.
  84. // http://blindsignals.com/index.php/2009/07/jquery-delay/
  85. delay: function( time, type ) {
  86. time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
  87. type = type || "fx";
  88. return this.queue( type, function( next, hooks ) {
  89. var timeout = setTimeout( next, time );
  90. hooks.stop = function() {
  91. clearTimeout( timeout );
  92. };
  93. });
  94. },
  95. clearQueue: function( type ) {
  96. return this.queue( type || "fx", [] );
  97. },
  98. // Get a promise resolved when queues of a certain type
  99. // are emptied (fx is the type by default)
  100. promise: function( type, obj ) {
  101. var tmp,
  102. count = 1,
  103. defer = jQuery.Deferred(),
  104. elements = this,
  105. i = this.length,
  106. resolve = function() {
  107. if ( !( --count ) ) {
  108. defer.resolveWith( elements, [ elements ] );
  109. }
  110. };
  111. if ( typeof type !== "string" ) {
  112. obj = type;
  113. type = undefined;
  114. }
  115. type = type || "fx";
  116. while( i-- ) {
  117. tmp = data_priv.get( elements[ i ], type + "queueHooks" );
  118. if ( tmp && tmp.empty ) {
  119. count++;
  120. tmp.empty.add( resolve );
  121. }
  122. }
  123. resolve();
  124. return defer.promise( obj );
  125. }
  126. });