.on()
jQuery 1.7には、.live()
以前のバージョンに代わる新しいメソッドがあるようです。
それらの違いと、この新しい方法を使用することの利点について知りたいと思います。
回答:
ライブを使用したくない理由は、ドキュメントでかなり明確になっています。また、Felixが述べた.on
ように、イベントを添付するためのより合理的な方法です。
.live()メソッドの使用は推奨されなくなりました。これは、jQueryの新しいバージョンでは、欠点のない優れたメソッドが提供されているためです。特に、.live()を使用すると、次の問題が発生します。
- jQueryは、
.live()
メソッドを呼び出す前にセレクターで指定された要素を取得しようとします。これは、大きなドキュメントでは時間がかかる場合があります。- 連鎖メソッドはサポートされていません。例えば、
$("a").find(".offsite, .external").live( ... );
ある ではない有効と期待どおりに動作しません。- すべての
.live()
イベントはdocument
要素にアタッチされるため、イベントは処理される前に可能な限り長く、最も遅いパスをたどります。event.stopPropagation()
イベントハンドラーの呼び出しは、ドキュメントの下部に添付されているイベントハンドラーを停止するには効果がありません。イベントはすでにに伝播されていdocument
ます。- この
.live()
メソッドは、驚くべき方法で他のイベントメソッドと相互作用します。たとえば、 !の$(document).unbind("click")
呼び出しによってアタッチされたすべてのクリックハンドラーを削除します.live()
。
live()
の動作を持つように変更された場合on()
、既存のコードが破損する可能性があります。jQueryの人々は、レガシーコードを「壊す」ことを必ずしも恐れていないことを示していますが、この場合、リグレッションを導入するリスクを冒さないことが理にかなっていると判断したと思います。
live()
1.7で非推奨になり、1.9で削除されました。api.jquery.com/live
人々から移動するときにつまずくことを一つの違い.live()
には、.on()
のためのパラメータがあることである.on()
DOMに動的に追加された要素にイベントをバインドするときに、わずかに異なっています。
.live()
メソッドで使用した構文の例を次に示します。
$('button').live('click', doSomething);
function doSomething() {
// do something
}
今で.live()
jQueryのバージョン1.7で非推奨とバージョン1.9で削除され、あなたが使用する必要がある.on()
方法を。この.on()
メソッドを使用した同等の例を次に示します。
$(document).on('click', 'button', doSomething);
function doSomething() {
// do something
}
.on()
ボタン自体ではなく、ドキュメントに対して呼び出していることに注意してください。2番目のパラメーターで、イベントをリッスンしている要素のセレクターを指定します。
上記の例.on()
では、ドキュメントを呼び出していますが、セレクターに近い要素を使用すると、パフォーマンスが向上します。を呼び出す前にページに存在する限り、任意の祖先要素が機能します.on()
。
これはここのドキュメントで説明されていますが、見逃しがちです。
公式ブログを見る
[..]新しい.on()および.off()APIは、jQueryでドキュメントにイベントを添付するすべての方法を統合します—そしてそれらは入力するのが短くなります![...]
.live()
このメソッドは、現在および将来の現在のセレクターに一致するすべての要素のイベントハンドラーをアタッチするために使用されます。
$( "#someid" ).live( "click", function() {
console.log("live event.");
});
そして
.on()
このメソッドは、1つ以上のイベントのイベントハンドラー関数を、以下の選択した要素にアタッチするために使用されます。
$( "#someid" ).on( "click", function() {
console.log("on event.");
});
上記のリンクからの引用
.live()の何が問題になっていますか
.live()メソッドの使用は推奨されなくなりました。これは、jQueryの新しいバージョンでは、欠点のない優れたメソッドが提供されているためです。特に、.live()を使用すると、次の問題が発生します。
- jQueryは、.live()メソッドを呼び出す前に、セレクターによって指定された要素を取得しようとします。これは、大きなドキュメントでは時間がかかる場合があります。
- 連鎖メソッドはサポートされていません。たとえば、$( "a")。find( "。offsite、.external")。live(…); は無効であり、期待どおりに機能しません。
- すべての.live()イベントはドキュメント要素に添付されるため、イベントは処理される前に可能な限り最長および最短のパスを取ります。
- イベントハンドラーでevent.stopPropagation()を呼び出すと、ドキュメントの下部にアタッチされているイベントハンドラーを停止するのに効果がありません。イベントはすでにドキュメントに伝播されています。
- .live()メソッドは、驚くべき方法で他のイベントメソッドと相互作用します。たとえば、$(document).unbind( "click")は、.live()の呼び出しによってアタッチされたすべてのクリックハンドラーを削除します。
詳細については、それをチェックしてください.. .live()および.on()
.live()メソッドは、コンテンツの動的生成を処理するときに使用されます... Jquery Sliderの値を変更したときにタブを追加するプログラムで作成したように、すべてのタブに閉じるボタン機能をアタッチしたい生成されます...私が試したコードは..
var tabs = $('#tabs').tabs();
// live() methos attaches an event handler for all
//elements which matches the curren selector
$( "#tabs span.ui-icon-close" ).live( "click", function() {
// fetches the panelId attribute aria-control which is like tab1 or vice versa
var panelId = $( this ).closest( "li" ).remove().attr( "aria-controls" );
$( "#" + panelId ).remove();
tabs.tabs( "refresh" );
});
そしてそれはかなりクールに動作します...
私はjQueryを使用するChrome拡張機能「CommentSave」の作成者であり、を使用したもの.live()
です。拡張機能が機能する方法は、を使用してすべてのテキスト領域にリスナーをアタッチすることです。live()
-これはうまく機能しました。ドキュメントが変更されるたびに、リスナーがすべての新しいテキスト領域にアタッチされるためです。
に引っ越しました.on()
が、うまくいきません。ドキュメントが変更されるたびにリスナーがアタッチされないため、を使用するように戻しました.live()
。それは私が推測するバグです.on()
。気をつけてね。
.live()
メソッドとはわずかに異なる構文を持っています。に相当.on()
するの$('p').live('click', function () { alert('clicked'); });
は$(document).on('click', 'p', function () { alert('clicked'); });
です。の.on()
メソッドを使用してdocument
から、リッスンするイベントハンドラーをアタッチする要素を2番目のパラメーターで指定することに注意してください。
ブラウザのクローズイベントを特定する必要があります。調査を行った後、jQuery1.8.3を使用して次のことを行っています。
ハイパーリンクがクリックされたときに、次のjQueryを使用してフラグをオンにします
$( 'a')。live( 'click'、function(){cleanSession = false;});
入力ボタンタイプの送信がクリックされたときに、次のjQueryを使用してフラグをオンにします
$( "input [type = submit]")。live( 'click'、function(){alert( 'input button clicked'); cleanSession = false;});
$( 'form')。live( 'submit'、function(){cleanSession = false;});
今重要なこと...私のソリューションは、.onの代わりに.liveを使用した場合にのみ機能します。.onを使用すると、フォームが送信された後にイベントが発生しますが、これは遅すぎます。多くの場合、フォームはjavascript呼び出し(document.form.submit)を使用して送信されます
したがって、.liveと.onの間には重要な違いがあります。.liveを使用すると、イベントはすぐに発生しますが、.onに切り替えると、時間どおりに発生しません。
.on
間違って使用している必要があります。そうでない場合、コード内の他の何かがこれを引き起こしています。おそらく、.on
メソッドのコードを貼り付けます。