30

このlive()メソッドは jQuery 1.7 で廃止されました。jQueryドキュメントは現在推奨しています

.on()イベント ハンドラーをアタッチするために使用します。古いバージョンの jQuery のユーザーは、 よりも.delegate()優先して使用する必要があります.live()

方法ondelegate機能は理解していますが、なぜそれらが優れているのかわかりません。live()よりシンプルで使いやすいです。

live非推奨になった理由はありますか?他の方法はどのように優れていますか?使い続けると何か悪いことはありますliveか?

4

7 に答える 7

33

ここでいくつかの説明を参照してください。

http://www.ultimatewebtips.com/why-jquery-live-is-a-bad-option-to-use/ (サイトがダウンしているようです)

見積もり:

  1. .live()再利用可能なウィジェットには使用できません。

  2. .stopPropagation()ライブでは機能しません。

  3. .live()遅いです。

  4. .live()チェーン可能ではありません。

のさらなる美しさ.on()は、すべてのイベントを非常に効率的に合理化することです: http://api.jquery.com/on/

APIリンクについて知っていて、どのように.on()機能するかを確認してください:)

見積もり:

.on() メソッドは、jQuery オブジェクトで現在選択されている要素のセットにイベント ハンドラーをアタッチします。jQuery 1.7 以降、.on() メソッドは、イベント ハンドラーをアタッチするために必要なすべての機能を提供します。古い jQuery イベント メソッドからの変換については、.bind()、.delegate()、および .live() を参照してください。.on() でバインドされたイベントを削除するには、.off() を参照してください。1 回だけ実行されてから削除されるイベントをアタッチするには、.one() を参照してください。

于 2012-06-20T08:49:23.363 に答える
10

live()は次の 2 つの理由で非効率的です。

  • コンストラクト$('selector').live()では、jQuery は最初にすべての要素を選択する必要があります。ただし、 を呼び出すときはlive()、( に格納されている) jQuery オブジェクトのセレクターのみが必要で.selectorあり、選択された要素は実際には使用されません。したがって、最初に一致するすべての要素を選択してから使用しないのは、やや無駄です。ターゲットセレクターをon()パラメーターとして使用します。つまり、ターゲット要素は事前に選択されておらず、イベントがトリガーされたときにのみテストが実行されます。delegate()
  • live()デフォルトではdocumentレベルでバインドされているため、すべてのイベントは DOM 全体でバブルアップする必要があります。でコンテキストを指定して絞り込むこともできますが、これにはor$(selector, context).live()を使った方がベターです。on()delegate()

新しいコードを作成するときは、非推奨on()の と の代わりに、最新かつ最高の を使用することを強くお勧めします。ただし、非常に多くのスクリプトが依存しているため、サポートがすぐに終了するとは考えていません(あるとしても)。また、 jQuery ソース自体は次のように定義されているため、 overを使用することの実際の欠点はありません。delegate()live()live()live()on()live()

live: function( types, data, fn ) {
    jQuery( this.context ).on( types, this.selector, data, fn );
    return this;
}
于 2012-06-20T08:54:37.213 に答える
4

liveこの方法には、主に次の 2 つの問題があります。

  1. すべてのイベント ハンドラーをドキュメント レベルでアタッチするため、ドキュメントにバブルアップするイベントはすべて、すべてのライブ イベントのイベント タイプおよびセレクターと照合する必要があります。イベントが多い場合、ページが遅くなります。イベントをチェックする範囲を制限するには、delegateまたはを使用する必要があります。on

  2. このメソッドの使用法は、セレクターがライブラリー内の他のメソッドと一緒に使用される方法に対して一般的ではありません。セレクターを使用して作成された jQuery オブジェクトでのみ使用できます。delegateandonメソッドは、メソッドにセレクターを提供するので、これを自然にします。

于 2012-06-20T08:59:22.577 に答える
1

live()ハンドラーをドキュメントにアタッチします。これにより、基本的に、指定された種類のすべてのイベントがインターセプトされ、セレクターに一致する要素を検索するためのコストが発生します。と を使用するdelegate()on()、予想されるターゲットの近く (可能であれば直接の親) にアタッチして、処理されるイベントの数を絞り込み、一致するターゲットをそれぞれ検索することをお勧めします。

于 2012-06-20T08:49:30.850 に答える
1

これは の性質によるものだと確信してい.live()ます。これは便利ですが、ほとんどの場合、必要以上のイベントをブラウザに検索させるため、使用するのは悪い習慣です。

デフォルトでは、特定のイベントについてドキュメント全体を検索するのではなく、特定のコンテナーを検索する方がデータ効率が高くなります。

live()確かに使いやすく、ほとんどのOS ufはそれを使用しても欠陥に気づきませんでした. bind()それは基本的に私の目に改善されました。

しかし、多くの場合、何を実行する必要があるかについてコードに適応し、より明確にする必要があります。

それは、なぜ何かをインポートしなければならないのか、なぜ最初からインポートしないのかを自問するようなものです。

于 2012-06-20T08:47:32.383 に答える
1

これは、 live() のパフォーマンスと制限に関するPaul Irish による詳細な記事です。

を引き続き使用するliveと、プロジェクトの jQuery ライブラリをアップグレードすると、遅かれ早かれコードが機能しなくなります。

于 2012-06-20T08:50:02.207 に答える
0

$('some selector').live(' ... ', handler)

と同じです

$(document).on(' ... ', 'some selector', handler)

したがって、live実際に使用するときは、すべてのハンドラーを DOM ツリーのルートに割り当てます。これには 2 つの欠点があります。

  1. ハンドラーを DOM ルートにアタッチすると、イベントが発生している間に通過する必要があるパスが増加します。それはパフォーマンスに悪い影響を与えます。
  2. 最後に を持つ他のハンドラーがハンドラーの起動return falseを妨げるリスクが高くなりますlive
于 2012-06-20T08:51:03.620 に答える