私は次のようなコードを持っています:
$('.someClass').each(function() {
$(this).on(...);
});
と
$('.someClass').on(...);
コードの最初と2番目のスニペットの舞台裏で何が起こっていますか?2つ目ははるかに高速に動作し、最初のものと同じ結果が得られることに気付きました。
まず、最初のスニペットでは、結果の要素ごとに個別のjQueryオブジェクトを作成しています。これは、追加の時間がかかることと関係があると思います。
簡単な行で、指定されたセレクターを使用してイベントバインディング.on()
の関数を内部的に実行し.each()
ます(コードとして.someClass
)。
のスニペットを参照してください.on()
:
on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
var type, origFn;
// Types can be a map of types/handlers
if ( typeof types === "object" ) {
// ( types-Object, selector, data )
if ( typeof selector !== "string" ) {
// ( types-Object, data )
data = data || selector;
selector = undefined;
}
for ( type in types ) {
this.on( type, selector, data, types[ type ], one );
}
return this;
}
if ( data == null && fn == null ) {
// ( types, fn )
fn = selector;
data = selector = undefined;
} else if ( fn == null ) {
if ( typeof selector === "string" ) {
// ( types, selector, fn )
fn = data;
data = undefined;
} else {
// ( types, data, fn )
fn = data;
data = selector;
selector = undefined;
}
}
if ( fn === false ) {
fn = returnFalse;
} else if ( !fn ) {
return this;
}
if ( one === 1 ) {
origFn = fn;
fn = function( event ) {
// Can use an empty set, since event contains the info
jQuery().off( event );
return origFn.apply( this, arguments );
};
// Use same guid so caller can remove using origFn
fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
}
return this.each( function() {
jQuery.event.add( this, types, fn, data, selector );
});
}
したがって、コードの最初のスニペットを通過する場合、つまり。.on()
内で呼び出すことにより、.each()
その要素自体に対しても.on()
実行されます。.each()