jQuery .on ('değişiklik', işlev () {} dinamik olarak oluşturulan girdiler için tetiklemiyor


148

Sorun şu ki, dinamik olarak oluşturulmuş bazı girdi etiketleri kümelerine sahip olmam ve ayrıca bir girdi değeri her değiştirildiğinde tetikleyecek bir işleve sahip olmam.

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

Ancak, .on('change')dinamik olarak oluşturulan herhangi bir girdi için tetiklemez, yalnızca sayfa yüklendiğinde mevcut olan öğeler için. Maalesef bu, beni biraz .onzor durumda bırakıyor .live()ve .delegate()bunların tümü için sarmalayıcılar .bind(): /

Bu sorunu olan veya bir çözüm bilen başka biri var mı?

Yanıtlar:


277

İşleve bir seçici sağlamalısınız on:

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

Bu durumda beklediğiniz gibi çalışacaktır. Ayrıca, belge yerine bir öğe belirtmek daha iyidir.

Daha iyi anlamak için bu makaleyi okuyun: http://elijahmanor.com/differences-between-jquery-bind-vs-live-vs-delegate-vs-on/


1
Müthişsin! Ben de bu sorunu yaşıyordum. Seçiciyi ikinci bir parametre olarak ekleyebileceğinizi hiç düşünmemiştim.
Tomatrox

1
evet, tüm belge yerine bazı öğelere daraltmanın iyi olduğuna işaret ettiği gibi, dinamik bölümden sonra bazı div'in bunu kullanması durumunda, örneğin: $ ('# ajax_table']. on ('değiştir', 'girdi ', function () {...
Raul Gomez

3
Öğem dinamik hale geldiyse, onunla daha sonra nasıl çalışabilirim? $ bu bana boş nesne veriyor.
aleXela

Mucizevi şekilde çalışır. Çok teşekkürler ! Ek olarak, aynı mantığın iki kez eklenmesini önlemek için .once () kullanabiliriz;)
benftwc

Alternatif sözdizimi: $(document).on({ change: handleChange }, 'input');artı işlev Zahmetli şeylerden const handleChange = (event) => { $(event.target)...kaçınmak güzel this.
Dem Pilafian

23

Bunu kullan

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

1
Bilginize, @enrey $('#id')kodda'#id'
Loaf

15

Herhangi bir yaklaşımı uygulayabilirsiniz:

$("#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 ... pasajın biraz açıklamasına ne dersiniz?
kleopatra

12
Bu, belge yüklenirken bağlanmaya çalıştığı için dinamik olarak oluşturulan öğelerle yine de çalışmaz. @ArtemVyshniakov'un yanıtı belgeye bağlanır ve öğelerden birindeki bir şey değiştiğinde, ikinci argüman nedeniyle tetiklenir, ardından gerekli öğeyi hedefleyebilir. (yani işlev tetiklendiğinde, tetikleyicinin kaynağının ikinci parametre ile eşleşip eşleşmediğini kontrol edecektir)
FullyHumanProgrammer

Bu kod, önceden yüklenmiş DOM'u kullanana kadar çalışmayacaktır. Seçiciyi belgeyle ilgili değişken olarak geçirmelisiniz api.jquery.com/on/#on-events-selector-data
benftwc

2

Sadece bazı olası karışıklıkları açıklığa kavuşturmak için. Bu yalnızca DOM yükünde bir öğe bulunduğunda çalışır:

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

Daha sonra bir öğe dinamik olarak yüklendiğinde şunları kullanabilirsiniz:

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

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

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

1

Bir eleman kullanıcı girdisi aldığında meydana gelen 'input' olayını kullanabilirsiniz.

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

w3'ten belgeler


1

kullanabilirsiniz:

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

Benimle çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.