1つのセレクターに複数のイベントハンドラーを持つjQuery .on()メソッド


139

複数のイベントが関連付けられている特定のセレクターでJquery .on()メソッドを使用する方法を理解しようとしています。以前は.live()メソッドを使用していましたが、.on()で同じ機能を実現する方法がよくわかりません。以下の私のコードを参照してください:

$("table.planning_grid td").live({
  mouseenter:function(){
     $(this).parent("tr").find("a.delete").show();
  },
  mouseleave:function(){
     $(this).parent("tr").find("a.delete").hide();        
  },
  click:function(){
    //do something else.
  }
});

私は呼び出すことによって複数のイベントを割り当てることができることを知っています:

 $("table.planning_grid td").on({
    mouseenter:function(){  //see above
    },
    mouseleave:function(){ //see above
    }
    click:function(){ //etc
    }
  });

しかし、私は.on()の適切な使用は次のようになると信じています:

   $("table.planning_grid").on('mouseenter','td',function(){});

これを達成する方法はありますか?または、ここでのベストプラクティスは何ですか?以下のコードを試しましたが、サイコロはありません。

$("table.planning_grid").on('td',{
   mouseenter: function(){ /* event1 */ }, 
   mouseleave: function(){ /* event2 */ },
   click: function(){  /* event3 */ }
 });

前もって感謝します!

回答:


252

それは逆です。あなたは書くべきです:

$("table.planning_grid").on({
    mouseenter: function() {
        // Handle mouseenter...
    },
    mouseleave: function() {
        // Handle mouseleave...
    },
    click: function() {
        // Handle click...
    }
}, "td");

1
なぜセレクタではないの$("table.planning_grid td")ですか?
Muers、

11
@ミュアーズ、それはうまくいくだろうし、質問者はそう認めるが、<table>個々の<td>要素の代わりにイベントをバインドするべきだとも信じている。これは確かに正しい方法です。
フレデリック

37
<td>ではなく<table>で.onを使用するのには十分な理由があり、後で<td>を動的に追加する場合に使用します。$( 'table td')。on ...は、この関数を呼び出したときにテーブルにある<td>にのみ影響します。$( 'table')。on(...、 'td'、function ...)は、後でこのテーブルに追加する<td>に影響します。
Raanan、2012年

8
@Raanan、確かに、それに加えて、1つのレジスターが登録するすべてのイベントハンドラーには、わずかではありますが、コストがかかります。数千のセルを処理する場合、使用可能なパフォーマンスを実現するには、要素<table>ごとに1つのハンドラではなく、1つのハンドラを登録すること<td>が必須になります。
フレデリックハミディ2012

1
同意した。「オン」は非常に一般的な言葉であり、ほとんどの結果はとに関連していたため.bind、この質問をググるのは非常に困難.liveです。良い答え、ちょうど私が探していたもの:D @Frédéric-あなたのリンクはidもはやjquery docsページのヘッダーにリンクしていません。おそらく更新されたドキュメントの結果です。しかし、私はそのページでこの答えを見つけることができませんでした。
nzifnab 2013年

186

また、同じ関数を実行する同じセレクターに複数のイベントハンドラーが接続されている場合は、次のように使用できます。

$('table.planning_grid').on('mouseenter mouseleave', function() {
    //JS Code
});

5
これが私が探していたものです
RozzA

...次に、e.typeで実際に発生したイベントタイプを取得します(イベントをパラメーターとして追加した後、つまり... function(e)...
William T. Mallard

24

異なるイベントで同じ関数を使用したい場合は、次のコードブロックを使用できます。

$('input').on('keyup blur focus', function () {
   //function block
})

11

ここから本当に役立つ基本的なことを学びました

この場合、関数の連鎖は非常に便利です。これは関数の出力も含めほとんどのjQuery関数機能します。

ほとんどのjQuery関数の出力は入力オブジェクトセットであるため、すぐに使用でき、短くて賢くなります。

function showPhotos() {
    $(this).find("span").slideToggle();
}

$(".photos")
    .on("mouseenter", "li", showPhotos)
    .on("mouseleave", "li", showPhotos);

7

そして、このようにして同じイベント/関数を組み合わせることができます:

$("table.planning_grid").on({
    mouseenter: function() {
        // Handle mouseenter...
    },
    mouseleave: function() {
        // Handle mouseleave...
    },
    'click blur paste' : function() {
        // Handle click...
    }
}, "input");

1

次のコードで試してください:

$("textarea[id^='options_'],input[id^='options_']").on('keyup onmouseout keydown keypress blur change', 
  function() {

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