(function( jQuery ) {
function handleQueueMarkDefer( elem, type, src ) {
var deferDataKey = タイプ "defer",
queueDataKey = タイプ "queue",
markDataKey = type "mark",
defer = jQuery._data( elem, deferDataKey );
if ( defer &&
( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
// 最初にハードコードされたコールバックが起動する余地を与えます
// そして最終的に mark/要素に何か他のものをキューに入れます
setTimeout( function() {
if ( !jQuery._data( elem, queueDataKey ) &&
!jQuery._data( elem, markDataKey ) ) {
jQuery.removeData ( elem, deferDataKey, true );
defer.fire();
}
}, 0 );
}
}
jQuery.extend({
_mark: function( elem, type ) {
if ( elem ) {
type = ( type || "fx" ) "mark";
jQuery._data( elem, type, (jQuery._data( elem,タイプ ) || 0) 1 );
}
},
_unmark: function(force, elem, type ) {
if (force !== true ) {
type = elem ;
要素 = 力;
力 = false;
}
if ( elem ) {
type = タイプ || "fx";
var key = type "mark"、
count = 強制 ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
if ( count ) {
jQuery._data( elem, key, count );
} else {
jQuery.removeData( elem, key, true );
handleQueueMarkDefer( elem, type, "mark" );
}
}
},
queue: function( elem, type, data ) {
var q;
if ( elem ) {
type = ( type || "fx" ) "queue";
q = jQuery._data( elem, type );
// これが単なる検索の場合は、すぐに出力してデキューを高速化します。
if ( data ) {
if ( !q || jQuery.isArray(data) ) {
q = jQuery. _data( elem, type, jQuery.makeArray(data) );
} else {
q.push( data );
}
}
return q || [];
}
},
デキュー: function( elem, type ) {
type = type || "fx";
var queue = jQuery.queue( elem, type )、
fn = queue.shift()、
hooks = {};
// fx キューがデキューされた場合は、常に進行状況センチネルを削除します。
if ( fn === "inprogress" ) {
fn = queue.shift();
}
if ( fn ) {
// fx キューが実行されないように進行状況監視を追加します
// 自動的にデキューされます
if ( type === "fx" ) {
queue.unshift( "進行中" );
}
jQuery._data( elem, type ".run", フック );
fn.call( elem, function() {
jQuery.dequeue( elem, type );
}, フック );
}
if ( !queue.length ) {
jQuery.removeData( elem, type "queue " type ".run", true );
handleQueueMarkDefer( elem, type, "queue" );
}
}
});
jQuery.fn.extend({
queue: function( type, data ) {
var setter = 2;
if ( typeof type !== "string" ) {
data = type;
type = "fx";
setter--;
if ( argument.length < setter ) {
return jQuery.queue( this[0], type ) ;
}
戻りデータ === 未定義 ?
this :
this.each(function() {
var queue = jQuery.queue( this, type, data );
if ( type === "fx" && queue[0] !== "inprogress" ) {
jQuery.dequeue( this, type )
}
});
dequeue: function( type ) {
return this.each(function() {
jQuery.dequeue( this, type );
});
},
//許可を得て、Clint Helfers によるプラグインに基づいています。
// http://blindsignals.com/index.php/2009/07/jquery-delay/
lay: function( time, type ) {
time = jQuery.fx.speeds[ time ] || time : time;
type = "fx"; {
var timeout = setTimeout( next, time );
hooks.stop = function() {
clearTimeout(
}); 🎜>clearQueue: function( type ) {
return this.queue( type || "fx", [] );
},
// 特定のタイプのキューが空になったときに解決された Promise を取得します
// (デフォルトでは fx がタイプです)
promise: function( type, object ) {
if ( typeof type !== "string" ) {
object = type;
タイプ = 未定義;
}
type = タイプ || "fx";
var defer = jQuery.Deferred()、
elements = this、
i = elements.length、
count = 1、
deferDataKey = type "defer"、
queueDataKey = type "queue",
markDataKey = type "mark",
tmp;
関数solve() {
if ( !( --count ) ) {
defer.resolveWith( 要素, [ 要素 ] );
}
}
while( i-- ) {
if (( tmp = jQuery.data( elements[ i ], deferDataKey, unknown, true ) ||
( jQuery.data ( elements[ i ]、queueDataKey、unknown、true ) ||
jQuery.data( elements[ i ]、markDataKey、unknown、 true ) ) &&
jQuery.data( elements[ i ]、deferDataKey、jQuery. Callbacks( "1 回のメモリ" ), true ) )) {
count ;
tmp.add(resolve);
}
}
resolve();
return defer.promise( object );
}
});
})( jQuery );
現時点では、実際に jQuery 内でフック機構が普及しています。1.5 は css モジュールの cssHooks、1.6 は属性モジュールの attrHooks、propHooks、boolHooks、nodeHooks、1.7 はイベント モジュールの fixHooks、keyHooks、mouseHooks、 1.8 はモジュールの _queueHooks です。_queueHooks のおかげで、キューは最終的に軽量化されました。
コードを表示?//1.8
jQuery.extend ({
queue: function( elem, type, data ) {
var queue;
if ( elem ) {
type = ( type || "fx" ) "queue";
queue = jQuery._data( elem, type );
// これが単なる検索の場合は、すぐに取り出してデキューを高速化します。
if ( data ) {
if ( !queue | | jQuery.isArray( data) ) {
queue = jQuery._data( elem, type, jQuery.makeArray(data) );
queue.push( data );
}
リターンキュー ||
}
},
デキュー: function( elem, type ) {
type = type || var queue = jQuery.queue( elem, type )、
fn = queue.shift()、
hooks = jQuery._queueHooks( elem, type )、
next = function() {
jQuery .dequeue( elem, type );
};
// fx キューがデキューされた場合、常に進行状況監視を削除します
if ( fn === "inprogress" ) {
fn = queue .shift();
}
if ( fn ) {
// fx キューが自動的にデキューされないように進行状況監視を追加します
//
if ( type === " fx" ) {
queue.unshift( "inprogress" );
}
// 最後のキューをクリアします stop function
deletehooks.stop;
fn.call( elem, next , フック );
}
if ( !queue.length && フック ) {
hooks.empty.fire();
}
},
// パブリック向けではありません消費 - queueHooks オブジェクトを生成するか、現在のものを返します。 ._data( elem, key, {
empty: jQuery.Callbacks("1 回メモリ").add(function() {
jQuery.removeData( elem, type "queue", true );
jQuery .removeData( elem, key, true );
})
})
}
});
jQuery.fn.extend({
queue: function( type,データ) {
var setter = 2;
if (typeof type !== "string" ) {
type = "fx";
}
if ( argument.length < setter ) {
return jQuery.queue( this[0], type );
}
return data === 未定義 ? :
this .each(function() {
var queue = jQuery.queue( this, type, data );
// このキューのフックを確保します
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 );
}); 🎜>// 許可を得て、Clint Helfers によるプラグインに基づいています。
// http://blindsignals.com/index.php/2009/07/jquery-delay/
lay: function( time, type) {
time = jQuery.fx.speeds[ time ] || time : time;
type = "fx" || return this.queue( next, フック ) {
var timeout = setTimeout( next, time )
hooks.stop = function() {
clearTimeout( timeout )
}; >},
clearQueue: function( type ) {
return this.queue( type || "fx", [] );
},
// のキューが解決されたときに Promise を取得します特定の型
// 空になります (fx がデフォルトの型です)
promise: function( type, obj ) {
var tmp,
count = 1,
defer = jQuery.Deferred (),
elements = this,
i = this.length,
resolve = function() {
if ( !( --count ) ) {
defer.resolveWith( elements, [ 要素 ] );
}
};
if ( typeof type !== "string" ) {
type = 未定義; type = type || "fx";
while( i-- ) {
if ((tmp = jQuery._data( elements[ i ], type "queueHooks" )) && tmp.empty ) {
カウント ;
tmp.empty.add( 解決 );
}
}
return defer.promise( obj )
}) ;
同時に、アニメーション モジュールは 3 回目の大規模な再構築を開始し、フック Tween.propHooks も追加されました。さらに 2 つのオブジェクトがあり、Animation は非同期キューを返し、Tween は単一のスタイルまたは属性の変更を処理するために使用されます。これは前の Fx オブジェクトと同等です。 animate は 1.72 では 100 行近くのサイズがありました。 jQuery はフック メカニズムと微分を使用して、いくつかの新しいオブジェクトを作成し、いくつかの巨大なメソッドを再構築します。現在、非常に長いメソッドはノード モジュールとコールバック モジュールにのみ制限されています。
コードをコピー
コードは次のとおりです:
animate: function( prop,speed, easing, callback ) {
var empty = jQuery.isEmptyObject( prop ),
optall = jQuery.speed(speed, easing, callback ),
doAnimation = function() {
// プロパティごとのイージングが失われないように、prop のコピーを操作します
var anim = Anime( this, jQuery.extend( {}, prop ), optall ) ;
// 空のアニメーションはすぐに解決されます
if ( empty ) {
}
}; false ?
this.each( doAnimation ) :
this.queue( optall.queue, doAnimation );
},
これまでのところ、すべての非同期処理は次のようになります。 jQuery を非同期キューの「サブクラス」または「バリアント」に変換する方が適切です。 Promise、Delay、またはさまざまな特殊効果メソッドを実行した後の domReady、アニメーション、AJAX、および jQuery オブジェクトなど。したがって、すべての非同期のものは Promise の保護下にあり、非同期プログラムは同期と同じように作成されます。