2012-04-02 12 views
25

です。live()メソッドはバージョン1.7以降で廃止されていますので、ソースを参照してライブイベントハンドラをすべてon()に変換し始めました。私は変化が簡単で、以前と同じようにすべてがうまくいくという印象を受けました。しかし、私はそれが必要なように動作しないいくつかのコードに遭遇した。jQuery .onは動作しませんが.liveは

私は

$('table.accordion-header').live("click", function ($e) { 
    // gobs of code 
} 

...次のjQueryは、テーブルタグのクリックイベントをバインドする選択が...とそれだけで正常に動作します(つまり、 - 私のテーブルタグのクリックイベントであっても、非同期の後に発生しますページのポストバックが発生します)。しかし、コードを次のように変更すると、ページの非同期ポストバックが発生した後にクリックイベントが発生しなくなります。注意してください。クリックイベントは、非同期のポストバック()まで機能しますが、それ以降はは機能しません。では、私はここで何が欠けていますか?

+0

"$(document).ready()"の関数型の中に入れているのか、前に呼び出さずにfalseを返すのかチェックしてください。チェックする方法があります:$( 'table.accordion-header')。trigger( 'click'); –

答えて

48

$('table.accordion-header').live("click", function ($e) { 
    // gobs of code 
}); 

と同等のは、人々がかなり.on()の方法を動的にバージョンを理解していないことをかなり一般的なようだと、このような

$(document).on("click", 'table.accordion-header', function ($e) { 
    // gobs of code 
}); 
+4

しかし、 '.on()'の仕組みや使用方法を本当に理解しているなら、 '$(document).on()'を使うよりも効率的な使い方があります。 '.live()'が置き換えられた主な理由の1つは、人々がこれをより効率的に使用できるようにすることでした。私の答えは以下のとおりです。 – jfriend00

+0

はい、確かに..私は単にOPが提供したものと一緒に作業していました...細かい制御のために '.delegate()'もありました... –

+0

あなたがクリックしている要素のIDを使用している場合は、構文 "#" $(document).on( "click"、 "#id_of_the_element"、function($ e){ // gobs of code }); –

53

質問が多く、何度も回答されているあります働く.on()は、あなたができるため.on()と交換した

$(someStaticParentObject).on("click", 'table.accordion-header', function ($e) { 
    // code 
} 

.live():あなたは、オブジェクトが、おそらくこのような.on()のダイナミックなフォームを使用するつもりあなたが.on()を呼び出す時に存在している必要があります.on()の静的なフォームを使用していますイベントハンドラをアタッチする動的オブジェクトの静的親オブジェクトを指定してより良いパフォーマンスを得るには、それをdocumentオブジェクトにアタッチする方が効率的です(.live())。 .on()の使い方を理解するために、これらの以前の回答(私が書いたもの)をお読みになることをお勧めします。

jquery: on vs live

Does jQuery.on() work for elements that are added after the event handler is created?

How does jQuery's new on() method compare to the live() method in performance?

What's the difference between jQuery.bind() and jQuery.on()?

Why not take Javascript event delegation to the extreme?

+0

あなたは静的な要素に付けることが文書よりも優れていると言いました。しかし、あなたが特定の親を知らないのであれば、 '$( 'body').vs' $(document).on'を使う利点は何ですか? –

+0

@PaulAlexander - まず、 '$(document.body)'と '$(document)'を比較してください。私はいつもDOM階層の中で最も低いものを選んでいますが(この場合はdocument.body)、実際にはおそらくそれほど大きな違いはありません。 – jfriend00

+0

@ jfriend00、多くの場合、DOMにロードされている他のオブジェクト(ページロード)が存在しないため、 'document'へのアタッチは唯一の可能性です。 – md1337

0
:これらの答えも .on()を使用するための最も効率的な方法と、それがどのように動作するかの簡単な説明についてのコメントを含めます

jQuery 1.7.2ソースでは、 "live"は "on"を指しているので、この問題はおそらく "on"関数には関係しません。これは除外される必要があります。 onのセレクタが問題になる可能性があります。

jQueryのソース:誰かがどのように最初の親またはコンテキストセレクタの作品を見せてくれた時に()で

live: function(types, data, fn) { 
    jQuery(this.context).on(types, this.selector, data, fn); 
    return this; 
}, 
+0

このコードをもっと詳しく見て、他の答えを読むと、 '.live()'の代わりにセレクタ ''table.accordion-header''を間違った場所に置いていることがわかります'.on()'。 – jfriend00

+0

ここで私が言っていることは、「生きている」と「上がっている」が同じであり、「生きている」点が「上がっている」ということです。それはセレクターの問題であり、生きているわけではありません。 –

+0

元の質問の中で私の答えを役に立たないものとしてマークする必要があるのはなぜですか?私は==生きていることを指摘しなければならず、2人の彼の元の誤解を除外することはむしろ示唆であった。 –

0

私は(私のライブを更新しようとのトラブルを持っていた)には、あまりにもが、最終的にはそれを得ました。キーは、この最初の要素がDocument Object Modelにあることを確認しています。

$(this)が.on()で動作する方法は明らかでもありません。あなたの関数のコード内の$(この)上に示した例では

$(document).on("click", 'table.accordion-header', function ($e) { 
    // gobs of code 
}); 

は、ご想像のとおり$(「table.accordion-ヘッダ」)及びません$(文書)を参照することになります。

ここでさらなる説明:私はこれを置くことができ.on() with $(this)

0

ベストな方法は、ドキュメントが.live().on()機能にjQueryからと言うだけのようです:

  1. あなたのセレクタには「$(セレクタ)」で投げます動的にではなくページを読み込む具体的な要素。
  2. 次にセレクタが表示されているメソッドにセカンダリセレクタを配置します。このセレクタは動的に作成できます。
//so this.. 
    $('table.accordion-header').live("click", function ($e) { 
    // gobs of code 
}); 

//becomes this.. 
    $('table').on("click",'.accordion-header', function ($e) { 
    // gobs of code 
}); 

"テーブル" はもちろんのページがロードされると仮定すると。

関連する問題