jQueryでlive()をon()に変える


202

私のアプリケーションは動的にドロップダウンを追加しました。ユーザーは必要なだけ追加できます。

私は伝統的に、jQueryのlive()メソッドを使用して、これらのドロップダウンの1つがchange()編集されたことを検出していました。

$('select[name^="income_type_"]').live('change', function() {
    alert($(this).val());
});

jQuery 1.7以降、これを次のように更新しました。

$('select[name^="income_type_"]').on('change', function() {
    alert($(this).val());
});

ドキュメントを見ると、これは完全に有効なはずです(そうですか?)-しかし、イベントハンドラーは起動しません。もちろん、jQuery 1.7がロードされて実行されていることなどを確認しました。エラーログにエラーはありません。

何が悪いのですか?ありがとう!


2
私はこれが遅いことを知っていますが、jQuery liveは実際にonとにかく使用しているようです。そのため、live削除されるまでレガシーコードの書き換えはまだ必要ないかもしれません。1.7.1のソースからの抜粋:live: function( types, data, fn ) {jQuery( this.context ).on( types, this.selector, data, fn ); return this;}したがって、存在しないバージョンにアップグレードしない場合はlive、レガシーコードをすぐに更新する必要はありません。以下のために新しいコース使用してオフコードon()の代わりとして推奨されます。この情報は、ある段階で他の誰かを助けるかもしれないと思いました。
いや

1
に変更する方法については、移行の例を参照してください。liveon
Samuel Liew

回答:


246

onドキュメント(太字;)の状態):

イベントハンドラーは、現在選択されている要素にのみバインドされます。これらは、コードがを呼び出すときにページ上に存在している必要があります.on()

に相当する.live()ものは

$(document.body).on('change', 'select[name^="income_type_"]', function() {
    alert($(this).val());
});

イベントハンドラーをできるだけ要素に、つまり階層内でより近くにバインドすることをお勧めします。

更新:別の質問に答えていると、これが.liveドキュメントにも記載されていることがわかりました:

.live()後継者の観点からメソッドを書き換えることは簡単です。これらは、3つすべてのイベント接続メソッドの同等の呼び出しのテンプレートです。

$(selector).live(events, data, handler);                // jQuery 1.3+
$(document).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(document).on(events, selector, data, handler);        // jQuery 1.7+

5
@ジャック:心配ありません、IMOそれは良い質問です。他の人も、をすべて変換しようとしたりbindlivedelegate呼び出したりすると、これにつまずくと思いますon
Felix Kling

4
はい、もちろん、この回答は、ブランケットの検索と置換を実行した後にのみ表示されます。.live>.on
ajbeaven

3
IMO、.onリスナーは実際に提供するセレクターに接続されているため、構文はより論理的です。イベントがトリガーされると、jQueryはDOMをトラバースし、指定された場所でハンドラーを実行します(単純なイベントの委任)。.live発生した何か「魔法」があったことを示唆し、完全に真実ではなかった「未来の要素」にイベントハンドラーをアタッチすると言われました。
デビッドHellsing

1
正しい@FelixKling-私もこれに遭遇しました!ありがとう
willdanceforfun 2012

2
検索エンジンの場合:jQueryの「.live()」メソッドはv1.7以降廃止され、v1.9で削除されました。代わりに ".on()"メソッドを使用してスクリプトを修正してください。驚いたことに、これは現在のMicrosoft jquery.unobtrusive-ajax.js v2.0.20710.0にも影響します(Microsoftもスクリプトを更新しなかったため、現在は壊れています)。
Tony Wall

25

選択した回答に加えて、

jQuery.livejQueryの1.9+には、あなたが移行するには、アプリケーションを待ちながら。これをJavaScriptファイルに追加します。

// Borrowed from jQuery 1.8.3's source code
jQuery.fn.extend({
  live: function( types, data, fn ) {
          if( window.console && console.warn ) {
           console.warn( "jQuery.live is deprecated. Use jQuery.on instead." );
          }

          jQuery( this.context ).on( types, this.selector, data, fn );
          return this;
        }
});

注:this.selector削除されるため、上記の関数はjQuery v3からは機能しません。

または、https://github.com/jquery/jquery-migrateを使用できます


7

サードパーティのコードの編集を含まないより良い解決策を見つけました:

https://github.com/jquery/jquery-migrate/#readme

jQuery Migrate NuGetパッケージをVisual Studioにインストールして、バージョン管理の問題をすべて解消します。次回、Microsoftが控えめなAJAXおよび検証モジュールを更新するときに、移行スクリプトなしでもう一度試して、問題が解決したかどうかを確認します。

jQuery MigrateはjQuery Foundationによって管理されているので、これはサードパーティライブラリの最善の方法であるだけでなく、ライブラリの更新方法を詳述する警告メッセージを受け取ることもできると思います。


3

選択した回答に加えて、

Visual Studioを使用している場合は、正規表現置換を使用できます。
編集>検索と置換>ファイルで置換
またはCtrl + Shift + H

[検索と置換]ポップアップで、これらのフィールドを設定します

何を検索: \$\((.*)\)\.live\((.*),
置換: $(document.body).on($2,$1,
検索オプションで[正規表現を使用]をオンにします


-1

jquery verision xxxjsエディターを開いて検索 jQuery.fn.extend

コードを追加

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

例:jquery-2.1.1.js-> 7469行目(jQuery.fn.extend)

画像ビューの例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.