jQuery .on ('thay đổi', function () {} không kích hoạt cho các đầu vào được tạo động


147

Vấn đề là tôi có một số bộ thẻ đầu vào được tạo động và tôi cũng có một chức năng nhằm kích hoạt bất cứ khi nào giá trị đầu vào được thay đổi.

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

Tuy nhiên, việc .on('change')này không kích hoạt cho bất kỳ đầu vào nào được tạo động, chỉ dành cho các mục có mặt khi trang được tải. Thật không may, điều này khiến tôi có một chút ràng buộc vì .onnó có nghĩa là sự thay thế cho .live().delegate()tất cả chúng là các hàm bao cho .bind(): /

Có ai khác có vấn đề này hoặc biết một giải pháp?

Câu trả lời:


272

Bạn nên cung cấp một bộ chọn cho onchức năng:

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

Trong trường hợp đó, nó sẽ hoạt động như bạn mong đợi. Ngoài ra, tốt hơn là chỉ định một số yếu tố thay vì tài liệu.

Đọc bài viết này để hiểu rõ hơn: http://elijahmanor.com/differences-b between-jquery-bind-vs-live-vs-delegate-vs-on/


1
Bạn thật tuyệt vời! Tôi cũng gặp vấn đề này Không bao giờ nghĩ rằng bạn có thể thêm bộ chọn làm tham số thứ hai.
Tomatrox

1
vâng, như đã chỉ ra việc thu hẹp một số phần tử thay vì toàn bộ tài liệu, trong trường hợp nếu phần động của nó sau một số div sử dụng phần tử đó, ví dụ: $ ('# ajax_table'). on ('thay đổi', 'đầu vào ', function () {...
Raul Gomez

3
Nếu yếu tố của tôi làm cho dinamicaly, làm thế nào tôi có thể làm việc với nó sau này? $ này cho tôi đối tượng trống rỗng.
aleXela

Nó hoạt động như một say mê. Cảm ơn rất nhiều ! Ngoài ra, chúng ta có thể sử dụng .once () để ngăn thêm hai lần logic tương tự;)
benftwc

Cú pháp thay thế: $(document).on({ change: handleChange }, 'input');cộng với chức năng const handleChange = (event) => { $(event.target)...Thật tốt để tránh những rắc rối this.
Dem Pilafian

23

Dùng cái này

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

FYI, @enrey đã đề cập đến $('#id')trong mã thay vì'#id'
Loaf

14

Bạn có thể áp dụng bất kỳ một phương pháp nào:

$("#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 ... làm thế nào về một chút giải thích của đoạn trích?
kleopatra

12
Điều này vẫn không hoạt động với các phần tử được tạo động, vì nó cố gắng liên kết với tải tài liệu. Tuy nhiên, câu trả lời của @ArtemVyshniakov liên kết với tài liệu và khi một cái gì đó trong một trong các yếu tố thay đổi, nó sẽ được kích hoạt, vì đối số thứ hai, sau đó nó có thể nhắm mục tiêu đến phần tử được yêu cầu. (có nghĩa là khi chức năng kích hoạt, nó sẽ kiểm tra xem nguồn kích hoạt có khớp với tham số thứ hai không)
FullHumanProgrammer

Mã này sẽ không hoạt động cho đến khi nó sử dụng DOM được tải sẵn. Bạn phải vượt qua bộ chọn dưới dạng biến liên quan đến tài liệu api.jquery.com/on/#on-events-selector-data
benftwc

2

Chỉ cần làm rõ một số nhầm lẫn tiềm năng. Điều này chỉ hoạt động khi một phần tử có mặt trên tải DOM:

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

Khi một phần tử được tải động sau này, bạn có thể sử dụng:

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

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

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

1

Bạn có thể sử dụng sự kiện 'đầu vào', xảy ra khi một yếu tố nhận được đầu vào của người dùng.

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

tài liệu từ w3


1

bạn có thể dùng:

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

Nó làm việc với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.