2013-02-06 10 views
8

jQueryで新しいやり方をするのに慣れようとしていますが、 "ライブ"バインディングの方法を理解できませんそれはオリジナルと同じようにエレガント/ドライです。以前は、と、私はあなたがこれを行うことができます信じている「生きる」一度だけの要素に言及:

$("#element_id").live("click",function(){ 
    //stuff 
}).live("mouseover", function(){ 
    //stuff 
}).live("mouseout", function(){ 
    //stuff 
}); 

さて、$(document).onで私がこれを行う必要があるだろうと思われる:

$(document).on("click","#element_id",function(){ 
    //stuff 
}).on("mouseover","#element_id",function(){ 
    //stuff 
}).on("mouseout","#element_id",function(){ 
    //stuff 
}); 

これはあまり簡潔で要素を繰り返す。これを達成するための明らかに簡単な方法はありますか?

+0

は、なぜあなたはとにかく*一意の識別子*(すなわち、そのID)を持つ要素のための委任イベントが必要でしょうか? –

+0

@MattiasBuelensこれは簡単な例でした。具体的には、AJAXを介して動的にロードされるテーブル行のイベントを設定しようとしているので、実際のセレクタは3回繰り返しないようにしようとしています。 "#element_id tr" – joshuahedlund

+0

[JQuery .on()イベントハンドラを一つのセレクタに渡す](http://stackoverflow.com/questions/8608145/jquery-on-method-with-multiple-event-handlers-to-one-selector) – j08691

答えて

21
$(document).on({ 
    click: function() {}, 
    mouseover: function() {}, 
    mouseout: function() {} 
}, '#element_id'); 

document注意してください。より具体的なセレクタを使用することができます。また、ID要素を動的に読み込むのが悪い習慣であるとは必ずしも言えませんが、疑わしいと思われます。

+0

ありがとう、私の理解は、特定のセレクタを使用する場合、動的にロードされる要素には適用されませんが、(ドキュメント)はそれになりますか? – joshuahedlund

+0

@joshuahedlund:第2パラメータは、イベントを「委任」することを意味します。 –

+1

@joshuahedlund動的にロードされた要素が '静的な'コンテナ(たとえばDOM内に常にある#コンテナ)内に追加されている限り、そのコンテナはバインディングソースとして使用できます(トップレベルの 'document ')。セレクタ引数は、そのコンテナ内の子孫要素によってトリガされたイベントをフィルタリングします。 –

3

あなたのコールバックがコードを共有する必要がある場合、私は、このアプローチは便利:

var handler = function (event) { 

    var $target = $(event.target); 

    if ($target.is('#element_id')) } 

     switch (event.type) { 
      case 'click': 
       // stuff 
      break; 
      case 'mouseenter': 
       // stuff 
      break; 
      case 'mouseleve': 
       // stuff 
      break; 
     } 

    } 

}; 

$(document).on({ 
    click: handler, 
    mouseenter: handler, 
    mouseleave: handler, 
}); 
関連する問題