queue.js 3.3 KB

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