jQuery .on ('เปลี่ยน', ฟังก์ชั่น () {} ไม่เรียกสำหรับอินพุตที่สร้างขึ้นแบบไดนามิก


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
คุณยอดเยี่ยมมาก! ฉันมีปัญหานี้ด้วย ไม่เคยคิดว่าคุณสามารถเพิ่มตัวเลือกเป็นพารามิเตอร์ตัวที่สองได้
Tomatrox

1
ใช่เป็นชี้ให้เห็นที่ดีที่จะ จำกัด ให้บางองค์ประกอบแทนเอกสารทั้งหมดในกรณีที่ถ้าส่วนแบบไดนามิกมันหลังจากบาง div ใช้ที่หนึ่งตัวอย่างเช่น: $ ('# ajax_table'). on ('เปลี่ยน', 'อินพุต ', function () {...
Raul Gomez

3
หากองค์ประกอบของฉันเป็นแบบ dinamicaly ฉันจะทำงานกับมันในภายหลังได้อย่างไร $ สิ่งนี้ทำให้ฉันวัตถุที่ว่างเปล่า
aleXela

มันทำงานเหมือนจับใจ ขอบคุณมาก ! นอกจากนี้เราสามารถใช้ .once () เพื่อป้องกันการเพิ่มตรรกะเดียวกันสองครั้งได้ด้วย)
benftwc

ไวยากรณ์สำรอง: $(document).on({ change: handleChange }, 'input');บวกฟังก์ชั่นมันเป็นเรื่องดีที่จะหลีกเลี่ยงลำบากconst handleChange = (event) => { $(event.target)... this
Dem Pilafian


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 อย่างไรก็ตามผูกกับเอกสารและเมื่อบางสิ่งบางอย่างในองค์ประกอบหนึ่งเปลี่ยนแปลงมันถูกไล่ออกเนื่องจากอาร์กิวเมนต์ที่สองนั้นสามารถกำหนดเป้าหมายองค์ประกอบที่ต้องการ (หมายถึงเมื่อฟังก์ชั่นยิงจะตรวจสอบว่าแหล่งที่มาของทริกเกอร์ตรงกับพารามิเตอร์ที่สอง)
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

คุณสามารถใช้เหตุการณ์ 'อินพุต' ที่เกิดขึ้นเมื่อองค์ประกอบรับอินพุตของผู้ใช้

$(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.