3

jQuery 1.7の時点で、.live()メソッドは非推奨になっていることを知っています。だからこれは私が思いついたものです:

$(document.body).on('click', '#list', function() {
    console.log($(this));
});

これはほとんどトリックを行い、以下と同等です:

$('#list').live('click', function(){
    console.log($(this));
});

どちらも#listjQueryオブジェクトを返します。これは私が望んでいたものです。ただし、問題は、文字列ではなく、jQueryオブジェクトを2番目のパラメーターとして渡す場合です(これは非常に頻繁に発生します)。例:

var list = $('#list');
$(document.body).on('click', list, function() {
    console.log($(this));
});

コンソールは$(body) jQueryオブジェクトを返します。その点では役に立たない。;) 何か案は?

編集:ここでの問題は、例1と2の影響を受けるオブジェクト$('# list ')にアクセスする方法ではなく、例3のオブジェクトにアクセスする方法です。

4

2 に答える 2

3

あなたが公式のドキュメントで見つけるかなり明確な答え:

.live()メソッドの使用は推奨されなくなりました。これは、jQueryの新しいバージョンでは、欠点のない優れたメソッドが提供されているためです。特に、.live()を使用すると、次の問題が発生します。

  • jQueryは、メソッドを呼び出す前にセレクターによって指定された要素を取得しようとします.live()。これは、大きなドキュメントでは時間がかかる場合があります。
  • 連鎖方法はサポートされていません。たとえば、$("a").find(".offsite, .external").live( ... ); は 無効であり、期待どおりに機能しません
  • すべての.live()イベントは要素にアタッチされるためdocument、イベントは処理される前に可能な限り長く、最も遅いパスをたどります。
  • イベントハンドラーの呼び出しevent.stopPropagation() は、ドキュメントの下部にアタッチされているイベントハンドラーを停止するのに効果的ではありません。イベントはすでにに伝播してい documentます。
  • この.live()メソッドは、驚くべき方法で他のイベントメソッドと相互作用します。たとえば、 !$(document).unbind("click")への呼び出しによってアタッチされたすべてのクリックハンドラーを削除します。.live()
于 2012-07-27T11:06:40.350 に答える
1

オブジェクトを2番目のパラメータとしてに渡すのは単に正しくありませんon

ドキュメントから:

.on( events [, selector] [, data], handler(eventObject) )

jQueryオブジェクトではなくセレクターを要求するため、以下を使用する必要があります。

$(document.body).on('click', '#list', function() {
    console.log($(this));
});
于 2012-07-27T11:25:16.543 に答える