.on( 'click')と.click()の違い


526

次のコードに違いはありますか?

$('#whatever').on('click', function() {
     /* your code here */
});

そして

$('#whatever').click(function() {
     /* your code here */
});

回答:


762

違いは使用パターンにあると思います。

前者の方メモリ使用量が少なく、動的に追加された要素を処理できるため、私はそれを優先.onします。.click

次のhtmlを検討してください。

<html>
    <button id="add">Add new</button>
    <div id="container">
        <button class="alert">alert!</button>
    </div>
</html>

新しいボタンを追加する場所

$("button#add").click(function() {
    var html = "<button class='alert'>Alert!</button>";
    $("button.alert:last").parent().append(html);
});

「アラート!」アラートを表示します。「クリック」または「オン」のいずれかを使用できます。


使うとき click

$("button.alert").click(function() {
    alert(1);
});

上記の場合、セレクターに一致するすべての要素に対して個別のハンドラーが作成されます。つまり

  1. 多くの一致する要素は多くの同一のハンドラーを作成し、メモリのフットプリントを増やします
  2. 動的に追加されたアイテムにはハンドラーがありません-つまり、上記のhtmlで新しく追加された「アラート!」ハンドラーを再バインドしない限り、ボタンは機能しません。

使うとき .on

$("div#container").on('click', 'button.alert', function() {
    alert(1);
});

上記では、動的に作成された要素を含め、セレクターに一致するすべての要素の単一のハンドラー。


...使用する別の理由 .on

Adrienが以下にコメントしたように、使用するもう1つの理由.onは名前空間付きイベントです。

ハンドラーを追加する場合、.on("click", handler)通常はハンドラーを削除すると、.off("click", handler)そのハンドラーが削除されます。明らかにこれは、関数への参照がある場合にのみ機能します。そうでない場合はどうでしょうか。名前空間を使用します。

$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });

バインド解除

$("#element").off("click.someNamespace");

2
何について:$( 'button.alert')。on( 'click'、function(){alert(1);}); ?
マシュー

8
@andreister:私が間違っているなら、私を修正するが、私は別の利点は、使用して名前空間の使用方法であると信じてon('click' ...)、参照stackoverflow.com/a/3973060/759452すなわち。on('click.darkenallothersections' ...)と同時にon('click.displaynextstep' ...)、私が使用して選択したものだけをアンバインドできます.unbind('click.displaynextstep')
Adrien Be

セレクターに一致する要素ごとに個別のハンドラーが作成されるとは思いません。1つのハンドラーが作成されると思いますが、オーバーヘッドは、このハンドラーを複数の要素にバインドし、これらのすべての要素を監視することから生じます。少なくとも、ドキュメントではこれが見つかりませんでした。
2014年

7
.onが動的に追加されたアイテムに対して機能するのに、.clickが機能しない理由を誰かが説明できますか?
MengT 2014年

2
on()jQueryのトレンドです。私は更新しなければならなかった$(window).load(function() {});$(window).on("load", function (e) {})、私はjQueryの3にアップグレードする場合
ビクターストッダード

37

次のコードに違いはありますか?

いいえ、質問の2つのコードサンプル間に機能的な違いはありません。 .click(fn)の「ショートカットメソッド」です.on("click", fn)。以下からのドキュメント.on()

.click()イベントハンドラーをアタッチまたはトリガーするために使用できるなど、一部のイベントには省略メソッドがあります。省略メソッドの完全なリストについては、イベントカテゴリを参照してください。

.on()は異なり、パラメータを渡す.click()ことで委任されたイベントハンドラを作成することがselectorできますが、そうではあり.click()ません。をパラメータ.on()なしで呼び出すとselector、とまったく同じように動作し.click()ます。イベントの委任が必要な場合は、を使用してください.on()


4
@andreisterが指摘したパフォーマンスの問題はどうですか?
rubo77

@ rubo77はごくわずかです。1ミリ秒かかります。
Rory McCrossan 2016年

1
@RoryMcCrossanそれは私にとって大したことです-私はこれを探しています。イベントを必要とするページに最大3000の質問があるからです。それぞれ1ミリ秒で、ページの実行時間が3秒長くなります。あなたのコメントは大きなリストには役に立ちません。
Randy

11
より大きな問題は、ページに3000の質問がある理由です。優れたUIパターンを使用している場合は、ページにそれほど多くの情報を含めることはできません。ページング、または遅延読み込みを調べます。イベントの委任を使用して、これらすべての要素に対して単一のイベントハンドラーを用意することもできます。
Rory McCrossan 2016年

5
@ rubo77-パフォーマンスの向上は、パラメーターを渡してイベント委任を使用する場合にのみ見られselectorます。パラメータ.on()なしで呼び出すと、をselector使用した場合に比べてパフォーマンスが向上しません.click()
gilly3 2016年

23

.on()jQuery 1.7以降、すべてのイベントバインディングを行うための推奨方法です。これは、両方のすべての機能をロール.bind()し、.live()一つの機能にあなたがそれに異なるパラメータを渡すよう変更が行動という。

例を書いているので、2つの間に違いはありません。どちらもハンドラをのclickイベントにバインドし#whateverます。選択した場合、のon()子によって起動されたイベントを#whatever単一のハンドラー関数に委任できるようにする柔軟性が追加されます。

// Bind to all links inside #whatever, even new ones created later.
$('#whatever').on('click', 'a', function() { ... });

「#whatever内のすべてのリンクにバインドします。後で作成された新しいリンクもバインドします。」それは正確に何を.live()しているのではないですか?また、これはの機能しか持たないという他の回答と矛盾しているようで.click()、今後のイベントには適用されません。
bgcode

3
@babonk -インテロバングは、最初の段落で述べたようので、これは、他の回答と矛盾しない.on()ものを行うことができ.click()ないし、何をすべきか.bind().live()行う-それはあなたがそれを呼び出すパラメーター何によって決まります。(いくつかの他の回答には、これも言及した。)注「#whatever内のすべてのリンクにバインド」であることかかわらない.live()ん、それは何.delegate()ありません。コンテナを指定するのではなく、.live()すべての内部にバインドしdocumentます。また.live()、jQuery 1.7以降では非推奨です。
nnnnnn

委任されたイベントの+1:「委任されたイベントハンドラーがアタッチされるときに存在することが保証されている要素を選択することにより、委任されたイベントを使用して、イベントハンドラーを頻繁にアタッチおよび削除する必要を回避できます。」api.jquery.com/on
jimasp

19

他の回答で述べたように:

$("#whatever").click(function(){ });
// is just a shortcut for
$("#whatever").on("click", function(){ })

ただし、.on()サポートされて.click()いない他のいくつかのパラメーターの組み合わせをサポートしているため、イベントの委任を処理できます(優先.delegate()および.live())。

(そしてもちろん、「キーアップ」、「フォーカス」などの他の同様のショートカットメソッドがあります。)

追加の回答を投稿する理由は.click()、パラメーターなしで呼び出した場合にどうなるかを言及するためです。

$("#whatever").click();
// is a shortcut for
$("#whatever").trigger("click");

.trigger()直接使用する場合、追加のパラメーターまたはjQueryイベントオブジェクトを渡すこともできますが、これはで行えません.click()

また、jQueryソースコード(jquery-1.7.1.js内)を見ると、内部的に.click()(または.keyup()など)関数が実際に.on()orを呼び出すことがわかります.trigger()。明らかに、これは実際に同じ結果が得られることを保証できることを意味しますが、使用.click()によりオーバーヘッドが少し増えることも意味します。ほとんどの状況で、心配したり、考えたりすることは何もありませんが、異常な状況では理論的には問題になる可能性があります。

編集:最後に、.on()複数のイベントを同じ関数に1行でバインドできることに注意してください。例:

$("#whatever").on("click keypress focus", function(){});

どちらの方法も使用するためにメモリに読み込まれていませんか?だからそれは問題ではないのですか?そして、読みやすさのために、それはおそらくより便利ですか?
Vince V.

@VinceV。- はい。「標準」の非委任イベントハンドラーの場合、どちらのメソッドも同じことを行い、パフォーマンスの違いは無視できるので、どちらのメソッドを使用するかは、実際には個人の好みの問題です。(私は通常選択します.click()。)
nnnnnn

9

いいえ、ありません。
のポイントon()は、他のオーバーロード、およびショートカットメソッドを持たないイベントを処理する機能です。


1
@arigold:他のオーバーロードです。
SLaks 2014

9

それらは同じように見えます... click()関数からのドキュメント:

このメソッドは.bind( 'click'、handler)のショートカットです

on()関数のドキュメント:

jQuery 1.7以降、.on()メソッドは、イベントハンドラーのアタッチに必要なすべての機能を提供します。古いjQueryイベントメソッドからの変換のヘルプについては、.bind()、. delegate()、および.live()を参照してください。.on()でバインドされたイベントを削除するには、.off()を参照してください。


両方のビューをマージする必要があります。Click()は.Bind()および.On()のショートカットです... JQUERY 1.7.0 +と同様に、これはTrigger( 'click')のショートカットでもあります。[ api.jquery.com/click/]
Dhanasekar

これはドキュメントからの非常に簡単な説明ですが、以下の回答は、.clickvsで一方が他方より優れている理由の良い例です.on
phatskat

@phatskat-たまたまあなたに同意します:)
dana

8

.click イベントは、要素がレンダリングされたときにのみ機能し、DOMの準備ができたときに読み込まれた要素にのみアタッチされます。

.on イベントはDOM要素に動的にアタッチされます。これは、ajaxリクエストなどでレンダリングされたDOM要素にイベントをアタッチする場合に役立ちます(DOMの準備ができた後)。


5

ここでは、クリックイベントを適用するさまざまな方法のリストを取得します。必要に応じて選択するか、クリックが機能しない場合は、これらの中から別の方法を試してください。

$('.clickHere').click(function(){ 
     // this is flat click. this event will be attatched 
     //to element if element is available in 
     //dom at the time when JS loaded. 

  // do your stuff
});

$('.clickHere').on('click', function(){ 
    // same as first one

    // do your stuff
})

$(document).on('click', '.clickHere', function(){
          // this is diffrent type 
          //  of click. The click will be registered on document when JS 
          //  loaded and will delegate to the '.clickHere ' element. This is 
          //  called event delegation 
   // do your stuff
});

$('body').on('click', '.clickHere', function(){
   // This is same as 3rd 
   // point. Here we used body instead of document/

   // do your stuff
});

$('.clickHere').off().on('click', function(){ // 
    // deregister event listener if any and register the event again. This 
    // prevents the duplicate event resistration on same element. 
    // do your stuff
})

3

彼らは現在click()を廃止しているので、on( 'click')で行くのが最善です


では、古いclick()動作が今必要な場合はどうしますか?
bgcode

1

あなたが動的に要素を追加するとき、インターネットといくつかの友人から私が学んだ限り、.on()が使用されます。しかし、クリックイベントでAJAXをnode.jsに送信し、新しい要素を追加する単純なログインページでそれを使用すると、マルチAJAX呼び出しが呼び出されます。click()に変更すると、すべてが正しく行われました。実際、私は以前この問題に直面していませんでした。


0

新しい要素

クリックして新しい要素にアタッチしたい場合は、上記の包括的な回答の補足として、重要なポイントを強調します。

  1. $( "body")などの最初のセレクターによって選択された要素は、宣言が行われたときに存在している必要があります。存在しない場合は、アタッチするものはありません。
  2. 2番目の引数としてターゲット要素の有効なセレクターを含む.on()関数の3つの引数を使用する必要があります。

-1
$('.UPDATE').click(function(){ }); **V/S**    
$(document).on('click','.UPDATE',function(){ });

$(document).on('click','.UPDATE',function(){ });
  1. $( '。UPDATE')。click(function(){});より効果的です。
  2. 使用するメモリが少なくなり、動的に追加される要素に対して機能します。
  3. フォームの行データのEDIT OR DELETE DATA時に、編集および削除ボタンを使用して動的にフェッチされたデータがJQueryイベントを生成しないこと$(document).on('click','.UPDATE',function(){ });がありました。更新または削除時にボタンが機能しない:

ここに画像の説明を入力してください


$(document).on( 'click'、 '。UPDATE'、function(){}); 1)より効果的です$( '。UPDATE')。click(function(){}); 2)それはより少ないメモリを使用し、動的に追加された要素のために働くことができます。3)編集および削除ボタンを使用して動的にフェッチされたデータが、フォームの行データの編集または削除時にJQueryイベントを生成しないことがあります$(document).on( 'click'、 '。UPDATE'、function() {}); 効果的に機能します。[jqueryを使用して取得した同じデータのように。更新時または削除時にボタンが機能しない
Devang Hire 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.