Jquery .on () ส่งเหตุการณ์


105

ฉันมีปัญหากับ.on(). ฉันมีองค์ประกอบฟอร์มหลายรายการ (มีรูปแบบด้วยclass="remember") และฉันเพิ่มอีกองค์ประกอบหนึ่งform.rememberโดยใช้ AJAX ดังนั้นฉันต้องการให้จัดการส่งเหตุการณ์เช่น:

$('form.remember').on('submit',function(){...}) 

แต่แบบฟอร์มที่เพิ่มด้วย AJAX ใช้ไม่ได้

ปัญหาอยู่ที่ไหน เป็นบั๊กหรือเปล่า?


10
ลอง$(document).on('submit','form.remember',function(){...})
Sergio

1
@Sergio แทนที่documentด้วยแม่แบบคงที่ที่ใกล้เคียงที่สุด
Mark Baijens

คำตอบ:


222

คุณต้องมอบหมายเหตุการณ์ในระดับเอกสาร

$(document).on('submit','form.remember',function(){
   // code
});

$('form.remember').on('submit'ทำงานเช่นเดียวกับ$('form.remember').submit(แต่เมื่อคุณใช้$(document).on('submit','form.remember'มันจะทำงานกับ DOM ที่เพิ่มในภายหลัง


24
นอกจากนี้โปรดทราบว่า$(document).onมีประสิทธิภาพต่ำกว่า$('form.remember').on('submit'มาก ตอนนี้ต้องรับฟังเหตุการณ์ที่ส่งทั้งหมดในเอกสาร การ จำกัด ขอบเขตให้ดีกว่าการฟังเล็กน้อยon documentถ้าเป็นไปได้
Liam

7
$ ('body'). on ('submit', 'form.remember', function () {// code}); แก้ไขปัญหาของฉัน
Olotin Temitope

แม้ว่า @Liam จะถูกต้อง แต่ $ (document) .on ก็ยังมีประโยชน์สำหรับการดำเนินการ CRUD บนองค์ประกอบที่แสดงผล ajax
Norielle Cruz

41

ฉันมีปัญหากับสัญลักษณ์เดียวกัน ในกรณีของฉันปรากฎว่าฟังก์ชันส่งของฉันไม่มีคำสั่ง "ส่งคืน"

ตัวอย่างเช่น:

 $("#id_form").on("submit", function(){
   //Code: Action (like ajax...)
   return false;
 })

2
โปรดทราบว่าreturn false;จะไม่ส่งแบบฟอร์ม return true;สำหรับการส่งแบบฟอร์มการใช้งาน
Kai Noack

0

ปัญหาคือ "เปิด" จะใช้กับองค์ประกอบทั้งหมดที่มีอยู่ในเวลานั้น เมื่อคุณสร้างองค์ประกอบแบบไดนามิกคุณต้องเรียกใช้อีกครั้ง:

$('form').on('submit',doFormStuff);

createNewForm();

// re-attach to all forms
$('form').off('submit').on('submit',doFormStuff);

เนื่องจากแบบฟอร์มมักจะมีชื่อหรือรหัสคุณสามารถแนบกับแบบฟอร์มใหม่ได้เช่นกัน หากฉันกำลังสร้างสิ่งที่มีไดนามิกจำนวนมากฉันจะรวมฟังก์ชันการตั้งค่าหรือการผูก:

function bindItems(){
    $('form').off('submit').on('submit',doFormStuff); 
    $('button').off('click').on('click',doButtonStuff);
}   

ดังนั้นเมื่อใดก็ตามที่คุณสร้างบางสิ่งบางอย่าง (ปุ่มมักจะอยู่ในกรณีของฉัน) ฉันก็โทรไปที่ bindItems เพื่ออัปเดตทุกอย่างบนหน้า

createNewButton();
bindItems();

ฉันไม่ชอบใช้ "ร่างกาย" หรือองค์ประกอบของเอกสารเพราะด้วยแท็บและวิธีการต่างๆพวกเขามักจะไปไหนมาไหนและทำในสิ่งที่คุณไม่คาดคิด ฉันพยายามที่จะเจาะจงให้มากที่สุดเท่าที่จะทำได้เว้นแต่จะเป็นโครงการ 1 หน้าธรรมดา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.