jQueryの.bind()と.on()


207

私は2件の偉大な記事が新しい機能について話した.on()jquery4u.comelijahmanor.com

.bind()それでもまだ使用する方が良い方法はあります.on()か?

たとえば、次のようなサンプルコードがあります。

$("#container").click( function( e ) {} )

セレクターによって取得されたアイテムは1つだけであり、私の場合、<div>名前が付けられ#containerているのは、ページが読み込まれたときに既に存在していることです。動的に追加されません。私がjQueryの最新バージョン1.7.2を使用していることを言及することが重要です。

そのサンプルでは、関数によって提供される他の機能を使用しない場合でも、.on()代わりに使用する必要が.bind()あり.on()ますか?


5
その2番目の記事はゴミです。.bind()複数の要素をバインドすることは悪い.on()ことですが、バインドモードで使用した場合の動作はまったく同じです。
Alnitak 2012

回答:


315

内部的.bind.onは、現在のバージョンのjQueryに直接マッピングされます。(同じことが.live。にも当てはまります。)そのため、.bind代わりに使用すると、パフォーマンスはわずかですが実用上重要ではありません。

ただし、.bind将来のバージョンからいつでも削除される可能性があります。使い続ける理由はなく、代わり.bindに好むあらゆる理由があり.onます。


5
おそらく-既存の関数にマップするだけなので、削除する理由はほとんどありません。一方、メジャーバージョン番号によるアップグレードは、APIに対してほぼ何でもできることを意味します。これは、その時点での下位互換性が必ずしも保証されていないためです。言ってるだけ'。
Blazemonger、2012

6
@Esailijaこれらの関数はすべて、特定のタイプの非同期要求を処理するための便利なショートカットを提供します。.bindそして、.on非委任イベントのために同じです。.bind以下のようなショートカットのいずれかの種類を提供していない$.getJSON
jackwanders

7
@jbabeyは、必ずしも機能を削除するわけではないことは技術的には真実ですが、非推奨であり、使用しないことをお勧めします。将来的には、常に完全に削除することを決定する可能性があります(バージョン2.xの時点で特定のIEサポートを削除する方法の種類)。非推奨の関数は使用しないでください。
ハンナ

8
「jQuery.fn.bind.toString()」を出力すると、「function(a、b、c){return this.on(a、null、b、c)}」が出力されます
Jowen

5
バインドとアンバインドjQueryの3のよう推奨されていません
ジョー・メイベル

58

これらのスニペットはすべてまったく同じことを実行します。

element.on('click', function () { ... });
element.bind('click', function () { ... });
element.click(function () { ... });

ただし、これらはすべて同じことを実行するこれらとは大きく異なります。

element.on('click', 'selector', function () { ... });
element.delegate('click', 'selector', function () { ... });
$('selector').live('click', function () { ... });

イベントハンドラーの2番目のセットは、イベントの委任を使用し、動的に追加された要素に対して機能します。委任を使用するイベントハンドラーのパフォーマンスも大幅に向上しています。最初のセットは動的に追加された要素では機能せず、パフォーマンスが大幅に低下します。

jQueryのon()関数は、まだ存在していなかった新機能を導入しません。これは、jQueryでのイベント処理を標準化する試みです(ライブ、バインド、またはデリゲートを決定する必要がなくなります)。


1
私はあなたの意味だと思い$('selector').live('click', function () { ... });ますが、ほぼ同じかのうなどとして結果を保つようにします。
andlrc

11

ダイレクトメソッド.delegateは、より優れたAPI .onであり、非推奨にする意図はありません。

コードの文字列型付けが少なくなるので、直接的な方法が推奨されます。サイレントバグではなく、イベント名を誤って入力すると、すぐにエラーが発生します。私の意見では、読み書きも簡単clickです。on("click"

.delegate優れている.onので、引数のための:

$(elem).delegate( ".selector", {
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
});

委任されていることはすぐにわかります。また、セレクターがすぐに表示されます。

.onそれはでも、委任だ場合、それはすぐにクリアしていない、あなたが選択のための最後を見ています:

$(elem).on({
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
}, "selector" );

さて、の命名.bindは本当にひどいもので、額面ではに比べて悪いです.on。ただし、.delegate委任されていないイベントは実行できず、直接的なメソッドがないイベントがあるため、このようなまれなケースでは、委任されたイベントと委任されていないイベントを明確に分離したい場合にのみ使用できます。


8
jQuery 3.0以降、.delegate()は非推奨になりました。
2017


6

jQueryドキュメントから:

jQuery 1.7以降、.on()メソッドは、イベントハンドラーをドキュメントに添付するための推奨メソッドです。以前のバージョンでは、.bind()メソッドは、イベントハンドラーを要素に直接アタッチするために使用されていました。ハンドラーはjQueryオブジェクトで現在選択されている要素にアタッチされるため、これらの要素は.bind()の呼び出しが発生した時点で存在している必要があります。より柔軟なイベントバインディングについては、.on()または.delegate()のイベント委任の説明を参照してください。

http://api.jquery.com/bind/


1
ドキュメントのアドバイスは、バインド、クリック、ライブ、委任などをもたらしたのと同じチームからのものであり、その結果生じるすべての混乱に留意してください。この問題に関する複数のサイトを読んだ後、私の意見では、最も適切で最も正確なサイトは「オン」を「糖衣」と表現しているサイトであり、砂糖はバグを引き付け、委任が進むべき道であると考えています。
DaveWalley 2014

4

Jquery 3.0以降では、.bindは非推奨になり、代わりに.onを使用することを好みます。@Blazemongerが以前に回答したように、削除される可能性があり、確実に削除されます。古いバージョンの場合、.bindは内部で.onも呼び出すため、それらの間に違いはありません。詳細については、APIも参照してください。

.bind()のjQuery APIドキュメント

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.