jQuery .on ('change', function () {} nie wyzwala dla dynamicznie tworzonych danych wejściowych

147

Problem polega na tym, że mam kilka dynamicznie tworzonych zestawów znaczników wejściowych, a także mam funkcję, która ma wyzwalać za każdym razem, gdy zmieniana jest wartość wejściowa.

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

Jednak .on('change')nie jest wyzwalany dla żadnych dynamicznie utworzonych danych wejściowych, tylko dla elementów, które były obecne podczas ładowania strony. Niestety to pozostawia mnie w pewnym kłopocie, ponieważ .onma być zamiennikiem, .live()a .delegate()wszystko to jest opakowaniem dla .bind(): /

Czy ktoś inny miał ten problem lub zna rozwiązanie?

Nacięcie
źródło

Odpowiedzi:

272

Powinieneś podać selektor do onfunkcji:

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

W takim przypadku będzie działać zgodnie z oczekiwaniami. Ponadto lepiej jest określić jakiś element zamiast dokumentu.

Przeczytaj ten artykuł, aby lepiej zrozumieć: http://elijahmanor.com/differences-between-jquery-bind-vs-live-vs-delegate-vs-on/

Artem Vyshniakov
źródło
1
Jesteś niesamowity! Ja też miałem ten problem. Nigdy nie myślałem, że możesz dodać selektor jako drugi parametr.
Tomatrox
1
tak, jak wskazano, dobrze jest zawęzić do jakiegoś elementu zamiast do całego dokumentu, w przypadku, gdy część dynamiczna jest po jakimś div, na przykład: $ ('# ajax_table'). on ('change', 'input ', funkcja () {...
Raul Gomez
3
Jeśli mój żywioł stał się dynamiczny, jak mogę później z nim pracować? $ to daje mi pusty obiekt.
aleXela
To działa jak urok. Wielkie dzięki ! Dodatkowo możemy użyć .once (), aby zapobiec dodaniu dwukrotnie tej samej logiki;)
benftwc
Alternatywna składnia: $(document).on({ change: handleChange }, 'input');plus funkcja const handleChange = (event) => { $(event.target)...Miło jest uniknąć kłopotów this.
Dem Pilafian,
23

Użyj tego

$('body').on('change', '#id', function() {
  // Action goes here.
});
Dixon
źródło
FYI, @enrey odnosił się $('#id')w kodzie zamiast'#id'
Bochenek
14

Możesz zastosować dowolne podejście:

$("#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
});
Arsman Ahmad
źródło
3
$("#id").change(function(){
    //does some stuff;
});
Azhar
źródło
11
hmm ... co powiesz na trochę wyjaśnienia fragmentu?
kleopatra
12
To nadal nie będzie działać z dynamicznie tworzonymi elementami, ponieważ próbuje wiązać się przy ładowaniu dokumentu. Odpowiedź @ArtemVyshniakov wiąże się jednak z dokumentem, a gdy coś w jednym z elementów ulegnie zmianie, jest odpalana, z powodu drugiego argumentu może wtedy skierować żądany element. (co oznacza, że ​​po uruchomieniu funkcji sprawdzi, czy źródło wyzwalacza pasuje do drugiego parametru)
FullyHumanProgrammer
Ten kod nie będzie działał, dopóki nie użyje wstępnie załadowanego DOM. Musisz przekazać selektor jako zmienną związaną z dokumentem api.jquery.com/on/#on-events-selector-data
benftwc
2

Tylko po to, aby wyjaśnić potencjalne zamieszanie. Działa to tylko wtedy, gdy element jest obecny podczas ładowania DOM:

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

Gdy element jest później dynamicznie ładowany, możesz użyć:

$(".parent-element").on('change', '#target', function(){
   //does some stuff;
});
dynero
źródło
2
$(document).on('change', '#id', aFunc);

function aFunc() {
  // code here...
}
Vinod Kumar
źródło
1

Możesz użyć zdarzenia „input”, które występuje, gdy element otrzymuje dane wejściowe użytkownika.

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

dokumentacja z w3

Alex
źródło
1

możesz użyć:

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

Działa ze mną.

Yehia Fouad
źródło