jQuery .on( 'change'、function(){}が動的に作成された入力に対してトリガーされない


147

問題は、動的に作成された入力タグのセットがいくつかあり、入力値が変更されるたびにトリガーされるようになっている関数もあることです。

$('input').on('change', function() {
  // Does some stuff and logs the event to the console
});

ただし、.on('change')は動的に作成された入力に対してはトリガーされず、ページがロードされたときに存在していたアイテムに対してのみトリガーされます。残念ながら、バインドのビットで、この葉に私は次のように.onのための代替であることを意味する.live().delegate()のラッパーであるすべては.bind():/

他に誰かがこの問題を抱えているか、解決策を知っていますか?

回答:


272

on関数へのセレクターを提供する必要があります。

$(document).on('change', 'input', function() {
  // Does some stuff and logs the event to the console
});

その場合、期待どおりに動作します。また、ドキュメントの代わりにいくつかの要素を指定することをお勧めします。

理解を深めるには、この記事をお読みください:http : //elijahmanor.com/differences-between-jquery-bind-vs-live-vs-delegate-vs-on/


1
あなたは素晴らしいです!私もこの問題を抱えていました。セレクターを2番目のパラメーターとして追加できるとは思いもしませんでした。
Tomatrox 2015年

1
ええ、動的部分がいくつかのdivの後にそれを使用する場合は、ドキュメント全体ではなくいくつかの要素に絞り込むのが良いと指摘しました。たとえば、$( '#ajax_table')。on( 'change'、 'input '、function(){...
Raul Gomez

3
要素が動的に変化した場合、後でどのように操作できますか?$ thisは空のオブジェクトを与えます。
aleXela 2016年

それは魅力のように働きます。どうもありがとう !さらに、.once()を使用して、同じロジックを2回追加しないようにすることができます;)
benftwc '30年

代替構文:$(document).on({ change: handleChange }, 'input');機能を追加const handleChange = (event) => { $(event.target)...する面倒な作業を避けるのは良いことですthis
Dem Pilafian

23

これを使って

$('body').on('change', '#id', function() {
  // Action goes here.
});

ちなみに、@ enreyは$('#id')コードの代わりに次のように言及していました'#id'
Loaf

14

次のいずれかのアプローチを適用できます。

$("#Input_Id").change(function(){   // 1st
    // do your code here
    // When your element is already rendered
});


$("#Input_Id").on('change', function(){    // 2nd (A)
    // do your code here
    // It will specifically called on change of your element
});

$("body").on('change', '#Input_Id', function(){    // 2nd (B)
    // do your code here
    // It will filter the element "Input_Id" from the "body" and apply "onChange effect" on it
});

3
$("#id").change(function(){
    //does some stuff;
});

11
うーん...スニペットの少しの説明はどうですか?
kleopatra

12
ドキュメントの読み込み時にバインドしようとするため、動的に作成された要素ではまだ機能しません。ただし、@ ArtemVyshniakovによる回答はドキュメントにバインドされ、要素の1つで何かが変更されると、2番目の引数により必要な要素をターゲットにできるため、要素が起動されます。(つまり、関数が起動すると、トリガーのソースが2番目のパラメーターと一致するかどうかがチェックされます)
FullyHumanProgrammer

このコードは、プリロードされたDOMを使用するまで機能しません。セレクターをドキュメント関連の変数api.jquery.com/on/#on-events-selector-data
benftwc

2

潜在的な混乱を明確にするためだけに。これは、要素がDOMロードに存在する場合にのみ機能します。

$("#target").change(function(){
    //does some stuff;
});

後で要素が動的に読み込まれると、以下を使用できます。

$(".parent-element").on('change', '#target', function(){
   //does some stuff;
});


1

要素がユーザー入力を受け取ったときに発生する「input」イベントを使用できます。

$(document).on('input', '#input_id', function() {
  // this will fire all possible change actions
});

w3のドキュメント


1

あなたは使うことができます:

$('body').ready(function(){
   $(document).on('change', '#elemID', function(){
      // do something
   });
});

それは私と一緒に動作します。

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