1. 程式人生 > >jQuery源碼05 (3653 , 3797) queue() : 隊列方法 : 執行順序的管理

jQuery源碼05 (3653 , 3797) queue() : 隊列方法 : 執行順序的管理

jquer jquery exp cache 之前 ise 參數 last 匿名

//對外接口
jQuery.extend({
    queue: function( elem, type, data ) {//入隊。元素、隊列名字、存進去的函數
    //jQuery.queue( this, type, function( next, hooks ) {})
        var queue;

        if ( elem ) {
            type = ( type || "fx" ) + "queue";//不寫隊列名字就是fx
            //    $.queue( document , ‘q1‘ , aaa||[aaa,bbb] ); 
            queue = data_priv.get( elem, type );//
get方法var cache = this.cache[ this.key( elem ) ];return type === undefined ? cache : cache[ type ];key方法return unlock = elem[ this.expando ];根據元素的唯一標識expando獲取在data_priv對象中緩存中的1,2,3,4這個unlock數字,根據unlock這個數字獲取cache中的json,根據type獲取json中的值 /* data_priv = { 1(document.203089541586732714850=1):{ name(type):‘哈哈‘(queue), q1queue(type):...(queue數組), } }
*/ // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) {//函數名 if ( !queue || jQuery.isArray( data ) ) {//queue沒有(函數是不是數組)或者queue有但是函數是數組,註意是數組就會把之前的全部覆蓋。 /* $.queue( document , ‘q1‘ , aaa ); $.queue( document , ‘q1‘ , bbb ); $.queue( document , ‘q1‘ , [ccc] );
*/ queue = data_priv.access( elem, type, jQuery.makeArray(data) ); } else {//queue有(說明q1隊列之前加過)並且函數不是數組直接push,註意queue沒有的時候queue始終存的是一個數組 queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; //只能寫jQuery.queue(),不能寫queue(),queue()是jQuery類的靜態方法,只能通過靜態方式調用。 /* jQuery.extend( {a:function(){alert(1)},b:function(){jQuery.a();}} ) $.b(); */ var queue = jQuery.queue( elem, type ),//得到type對應的值,是一個數組, startLength = queue.length, fn = queue.shift(),//去除數組第一個 hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type );//下一個,不能直接寫dequeue,這行語句還沒執行完時dequeue是不存在的 }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { 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" );//inprogress添進去 } // clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks );//出隊的函數執行, } if ( !startLength && hooks ) { hooks.empty.fire(); } }, /* data_priv = { 1(elem:document.203089541586732714850=1):{ name(type):‘哈哈‘(queue), q1queue(type):...(queue數組), } } */ _queueHooks: function( elem, type ) { var key = type + "queueHooks"; //有就獲取,沒有key,value都存在value是json就追加 return data_priv.get( elem, key ) || data_priv.access( elem, key, { empty: jQuery.Callbacks("once memory").add(function() { data_priv.remove( elem, [ type + "queue", key ] ); }) }); } }); jQuery.fn.extend({ //this.queue( type, function( next, hooks ) { //$(‘#div‘).queue(‘q1‘,bbb); queue: function( type, data ) { var setter = 2; //$(‘#div‘).queue(bbb); if ( typeof type !== "string" ) {//只傳了一個函數,沒有type data = type; type = "fx"; setter--; } ///console.log( $(‘#div‘).queue(‘q1‘) ); 查看 if ( arguments.length < setter ) { return jQuery.queue( this[0], type );//靜態方法調用 } return data === undefined ? this : this.each(function() {//$(‘#div‘)是一個數組,對每一個設置 var queue = jQuery.queue( this, type, data );//每一個入隊 // ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type );//第一個入隊然後立即出隊,調用 } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type );//每一個出隊 }); }, //.delay(2000) /* jQuery.fx.speeds = { slow: 600, fast: 200, // Default speed _default: 400 }; */ //jQuery.fx = Tween.prototype.init; delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; //queue第二個參數是匿名函數,也添加進去 return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] );//空數組是真 }, //隊列全部執行完之後,再去調用 promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; 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 ); } } resolve(); return defer.promise( obj ); } });

jQuery源碼05 (3653 , 3797) queue() : 隊列方法 : 執行順序的管理