juery源码之queue(队列)

   queue是jQuery的队列方法,可以用于动画处理,已经多个回调的处理。

   queue模块向外开放的api分别是:

  •  $上,即工具方法上的$.queue()、$.dequeue()、$._queueHooks()
  •  jQuery实例方法,queue、dequeue、clearQueue、promise
  queue是入列,dequeue是出列。

$.queue():

用法

   $.queue($(".test")[0],"fun",function(){
        console.log(1);
    });
    $.queue($(".test")[0],"fun",function(){
        console.log(2);
    });

源码

queue: function( elem, type, data ) {
		var queue;

		if ( elem ) {    
			type = ( type || "fx" ) + "queue";  //如果type存在就用type入参连接字符串,否则默认的fx。
			queue = data_priv.get( elem, type ); //调用数据缓存data查找数据缓存

			// Speed up dequeue by getting out quickly if this is just a lookup
			if ( data ) {   //如果传入data入参 
				if ( !queue || jQuery.isArray( data ) ) {  //如果查找的数据缓存不存在或者data是数组;如果是数组,会把之前的queue覆盖掉
					queue = data_priv.access( elem, type, jQuery.makeArray(data) );  //直接设置data缓存
				} else {
					queue.push( data );  //如果存在了queue,则直接放入数组
				}
			}
			return queue || [];
		}
	},

$.dequeue

用法

将回调出列,每调用一次出列一个。因如果有N个回调,调用N次dequeue才能全部出列。第一个参数是DOM元素,第二个是队列的名字。出队的同时,queue队列的回调函数将会触发。
 $.dequeue($(".test")[0],"fun");  //1

源码

dequeue: function( elem, type ) {
		type = type || "fx"; 

		var queue = jQuery.queue( elem, type ), //查找数据缓存
			startLength = queue.length,
			fn = queue.shift(),  //队列的第一项出列
			hooks = jQuery._queueHooks( elem, type ), 
			next = function() {  //next函数,可用于下一个出列
				jQuery.dequeue( elem, type );   
			};

		// If the fx queue is dequeued, always remove the progress sentinel
		if ( fn === "inprogress" ) { //用于默认fx类型的出队
			fn = queue.shift();  
			startLength--;
		}

		if ( fn ) {

			// Add a progress sentinel to prevent the fx queue from being
			// automatically dequeued
			if ( type === "fx" ) {  //用于默认类型
				queue.unshift( "inprogress" );
			}

			// Clear up the last queue stop function
			delete hooks.stop;
			fn.call( elem, next, hooks );  //调用
		}

		if ( !startLength && hooks ) {  //如果length=0且hookes不为undefined,清空data缓存
			hooks.empty.fire();
		}
	},

next用法

next可以用于出列。

  $.queue($(".test")[0],"fun",function(next){
        console.log(1);
        next();
    });
    $.queue($(".test")[0],"fun",function(){
        console.log(2);
    });

    $.dequeue($(".test")[0],"fun");


_queueHooks

用于当fx队列的数据全部出队列后,清除data数据缓存
	_queueHooks: function( elem, type ) {
		var key = type + "queueHooks";
		return data_priv.get( elem, key ) || data_priv.access( elem, key, {
			empty: jQuery.Callbacks("once memory").add(function() {   //callbacks对象,并且添加了回调函数用于清除数据缓存
				data_priv.remove( elem, [ type + "queue", key ] );
			})
		});
	}

$(selector).queue(type,data)

用法

    $(".test").queue("fun", function () {
        console.log(1);
    });
    $(".test").queue("fun",function(){
        console.log(2);
    });
    
或者:
    $(".test").queue(function () {
        console.log(1);
    });
    $(".test").queue(function(){
        console.log(2);
    });
这种方式添加到队列,队列的第一项会自动执行,在控制台打印1.

源码

queue: function( type, data ) {
		var setter = 2;

		if ( typeof type !== "string" ) {
			data = type;    //如果type缺省,默认为fx
			type = "fx";
			setter--;  //setter值减一
		}

		if ( arguments.length < setter ) {
			return jQuery.queue( this[0], type ); //如果入参个数小于setter,则为查找
		}

		return data === undefined ?
			this :
			this.each(function() {
				var queue = jQuery.queue( this, type, data ); //调用工具方法的入队

				// Ensure a hooks for this queue
				jQuery._queueHooks( this, type );   //可以用于删除data缓存

				if ( type === "fx" && queue[0] !== "inprogress" ) { //如果是默认类型 fx,并且队列的第一项不是inprogress
					jQuery.dequeue( this, type );   //则自动出队
				}
			});
	},

$(selector).dequeue(type)

用法:

    $(".test").queue("fun",function () {
        console.log(1);
    });
    $(".test").queue("fun",function(){
        console.log(2);
    });
    $(".test").dequeue("fun");
    $('.test').dequeue("fun");

源码

	dequeue: function( type ) {
		return this.each(function() {
			jQuery.dequeue( this, type );
		});
	},

clearQueue:

用法

   $(".test").clearQueue("fun");

源码

clearQueue: function( type ) {
		return this.queue( type || "fx", [] );
	},


promise

用法

等所有的队列出队完再执行done添加的函数
   $(".test").queue("fun",function () {
        console.log(1);
    });
    $(".test").queue("fun",function(){
        console.log(2);
    });
    $(".test").promise("fun").done(function(){
        console.log("Done!");
    })
    $(".test").dequeue("fun");
    $('.test').dequeue("fun");
    $('.test').dequeue("fun");

源码

	promise: function( type, obj ) {
		var tmp,
			count = 1,
			defer = jQuery.Deferred(),
			elements = this,
			i = this.length,
			resolve = function() {
				if ( !( --count ) ) {
					defer.resolveWith( elements, [ elements ] );  //延迟对象resoleWith函数触发
				}
			};

		if ( typeof type !== "string" ) {
			obj = type;
			type = undefined;
		}
		type = type || "fx";

		while ( i-- ) {
			tmp = data_priv.get( elements[ i ], type + "queueHooks" );
			if ( tmp && tmp.empty ) {
				count++;
				tmp.empty.add( resolve );   //添加到callbacks回调中
			}
		}
		resolve();
		return defer.promise( obj );
	}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值