ฉันมีสองโมดูลที่แตกต่างกันซึ่งในหลาย ๆ วิธีทำงานร่วมกัน หนึ่งในสิ่งที่พวกเขาทำงานร่วมกันคือโมดูล A โหลดเนื้อหาผ่าน AJAX และโมดูล B จำเป็นต้องแนบผู้ฟังเหตุการณ์กับเนื้อหาที่โหลด
แต่ปรากฏว่าเมื่อเนื้อหาที่โหลดผ่าน AJAX โดยโมดูลเพียงฟังก์ชั่น 'แนบ' ของDrupal.behaviours.aได้รับการเรียกและไม่ฟังก์ชั่น 'แนบ' ของDrupal.behaviours.b ทั้งสองฟังก์ชั่นได้รับการเรียกใช้เมื่อโหลดหน้าเว็บ แต่ไม่ได้โหลด AJAX เนื้อหาต่อมา
// This runs every time module A loads new content.
Drupal.behaviors.a = {
attach: function(context, settings) {
alert('a:attach');
}
}
// This only runs on page load, but never when module A loads new content.
Drupal.behaviors.b = {
attach: function(context, settings) {
alert('b:attach');
}
}
ฉันจะทำให้ฟังก์ชั่น 'แนบ' ของDrupal.behaviours.bทำงานทุกครั้งที่โมดูลใด ๆ โหลดเนื้อหาใหม่ได้อย่างไร
ไม่ แต่ควรที่จะไม่ได้รับการดูแลโดยอัตโนมัติหรือไม่ ฉันคิดว่าเป็นความคิดทั้งหมดของฟังก์ชั่น 'แนบ'; ควรเรียกว่าเมื่อโหลดหน้าเว็บและอัปเดตหน้าเว็บหรือไม่ ดูเหมือนว่าจะมีเฉพาะฟังก์ชัน 'แนบ' สำหรับโมดูลการเรียกใช้ที่ได้รับการเรียกในการอัปเดตหน้าเว็บใช่ไหม
—
sbrattla
นั่นคือความเข้าใจของฉันใช่ฉันไม่เคยมองลึกลงไป ฉันรู้ว่ามีบางครั้งที่หลังจากการโทร AJAX ฉันต้อง reattach พฤติกรรมดังนั้นฉันแค่คิดว่ามันเป็นสิ่งจำเป็น
—
Clive
ดูที่ drupal.js: "Drupal.attachBehaviors ถูกเพิ่มด้านล่างเข้ากับเหตุการณ์ jQuery ready และทำงานบนการโหลดหน้าเริ่มต้นผู้พัฒนาที่ใช้ AHAH / Ajax ในโซลูชันควรเรียกฟังก์ชั่นนี้หลังจากโหลดเนื้อหาหน้าใหม่แล้ว องค์ประกอบที่ต้องดำเนินการเพื่อแนบการทำงานทั้งหมดกับเนื้อหาใหม่ " ดูเหมือนว่าฉันต้องเรียกใช้ AttachBehaviours ด้วยตัวเอง แต่; มันเป็นปริศนาให้ฉันฟังก์ชั่น 'แนบ' ของโมดูล A ทำงานแม้ว่าฉันจะไม่ได้เรียกใช้ AttachBehaviours ในการโทรกลับสำเร็จ AJAX ... เหตุใดจึงใช้เฉพาะกับโมดูลที่เรียกใช้และไม่ใช่ทุกโมดูล
—
sbrattla
หากคุณต้องการวิธีแก้ปัญหาแบบ catch-all
—
Clive
$('body').ajaxSuccess(Drupal.attachBehaviors);
อาจใช้ได้
Drupal.attachBehaviors();
ใน ajax success callback หรือไม่?