jQuery .on ('change', function () {} wird nicht für dynamisch erstellte Eingaben ausgelöst


147

Das Problem ist, dass ich einige dynamisch erstellte Sätze von Eingabe-Tags habe und auch eine Funktion habe, die jedes Mal ausgelöst werden soll, wenn ein Eingabewert geändert wird.

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

Dies .on('change')wird jedoch nicht für dynamisch erstellte Eingaben ausgelöst, sondern nur für Elemente, die beim Laden der Seite vorhanden waren. Leider lässt mich das ein bisschen hängen .on, da es der Ersatz für sein soll .live()und .delegate()alle Wrapper für .bind(): /

Hat jemand anderes dieses Problem gehabt oder eine Lösung gekannt?

Antworten:


272

Sie sollten einen Selektor für die onFunktion bereitstellen :

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

In diesem Fall funktioniert es wie erwartet. Es ist auch besser, ein Element anstelle eines Dokuments anzugeben.

Lesen Sie diesen Artikel zum besseren Verständnis: http://elijahmanor.com/differences-between-jquery-bind-vs-live-vs-delegate-vs-on/


1
Du bist toll! Ich hatte auch dieses Problem. Ich hätte nie gedacht, dass Sie den Selektor als zweiten Parameter hinzufügen könnten.
Tomatrox

1
Ja, wie bereits erwähnt, ist es gut, sich auf ein Element anstatt auf ein ganzes Dokument zu beschränken, falls der dynamische Teil nach einem Div dieses verwendet, zum Beispiel: $ ('# ajax_table'). on ('change', 'input ', function () {...
Raul Gomez

3
Wie kann ich später damit arbeiten, wenn mein Element dinamisch geworden ist? $ das gibt mir leeres Objekt.
AleXela

Es wirkt wie ein Zauber. Vielen Dank ! Außerdem können wir .once () verwenden, um zu verhindern, dass doppelt dieselbe Logik hinzugefügt wird;)
Ben Cassinat

Alternative Syntax: $(document).on({ change: handleChange }, 'input');plus die Funktion const handleChange = (event) => { $(event.target)...Es ist schön, die Probleme zu vermeiden this.
Dem Pilafian

23

Benutze das

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

Zu Ihrer Information, @enrey bezog sich $('#id')im Code anstelle von'#id'
Loaf

14

Sie können einen beliebigen Ansatz anwenden:

$("#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
hmm ... wie wäre es mit einer Erklärung des Snippets?
Kleopatra

12
Dies funktioniert bei dynamisch erstellten Elementen immer noch nicht, da beim Laden des Dokuments versucht wird, eine Bindung herzustellen. Die Antwort von @ArtemVyshniakov ist jedoch an das Dokument gebunden, und wenn sich etwas in einem der Elemente ändert, wird es ausgelöst, da es aufgrund des zweiten Arguments auf das erforderliche Element abzielen kann. (Das heißt, wenn die Funktion ausgelöst wird, wird
geprüft

Dieser Code funktioniert erst, wenn das vorinstallierte DOM verwendet wird. Sie müssen den Selektor als dokumentbezogene Variable api.jquery.com/on/#on-events-selector-data
Ben Cassinat

2

Nur um mögliche Verwirrung zu klären. Dies funktioniert nur, wenn beim DOM-Laden ein Element vorhanden ist:

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

Wenn ein Element später dynamisch geladen wird, können Sie Folgendes verwenden:

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

2
$(document).on('change', '#id', aFunc);

function aFunc() {
  // code here...
}

1

Sie können das Ereignis 'input' verwenden, das auftritt, wenn ein Element Benutzereingaben erhält.

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

Dokumentation von w3


1

Sie können verwenden:

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

Es funktioniert bei mir.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.