ฉันต้องการโค้ดจาวาสคริปต์จากโมดูล X เพื่อทำงานเฉพาะหลังจากที่หนึ่งจากโมดูล Y ได้ทำงานแล้ว วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?
ฉันต้องการโค้ดจาวาสคริปต์จากโมดูล X เพื่อทำงานเฉพาะหลังจากที่หนึ่งจากโมดูล Y ได้ทำงานแล้ว วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?
คำตอบ:
รหัส JavaScript ที่ใช้โดย Drupal 7 มีดังต่อไปนี้:
Drupal.attachBehaviors = function (context, settings) {
context = context || document;
settings = settings || Drupal.settings;
// Execute all of them.
$.each(Drupal.behaviors, function () {
if ($.isFunction(this.attach)) {
this.attach(context, settings);
}
});
};
Drupal 6 ใช้รหัสที่คล้ายกัน:
Drupal.attachBehaviors = function(context) {
context = context || document;
if (Drupal.jsEnabled) {
// Execute all of them.
jQuery.each(Drupal.behaviors, function() {
this(context);
});
}
};
หากจาวาสคริปต์จะรับประกันว่าคุณสมบัติของออบเจ็กต์ / อาเรย์นั้นจะถูกส่งjQuery.each()
เข้าไปในลำดับเดียวกันเสมอซึ่งจะถูกเพิ่มค่าเหล่านั้นจะถูกส่งผ่านจากฟังก์ชั่นที่ใช้เป็นพารามิเตอร์ที่สองตามลำดับเดียวกัน
นี่หมายความว่าพฤติกรรมแรกที่แทรกเข้าไปDrupal.behaviors
จะถูกดำเนินการก่อน
ในกรณีนี้เพื่อให้พฤติกรรมที่กำหนดโดยโมดูลของคุณดำเนินการก่อนคุณสามารถใช้น้ำหนักที่เบาลงได้ หากคุณต้องการให้มีการดำเนินการต่อหน้าโมดูลอื่นให้ตั้งค่าน้ำหนักของโมดูลเป็น -50 ค่าอื่น ๆ ก็สามารถทำงานได้เช่นกัน หากคุณใช้ Drupal 7, drupal_add_js ()อนุญาตให้เชื่อมโยงน้ำหนักกับรหัส JavaScript รหัส JavaScript ที่มีน้ําหนักเบาจะปรากฏขึ้นก่อนในเอาต์พุต HTML สิ่งนี้เป็นไปไม่ได้เมื่อใช้ Drupal 6
JavaScript ไม่รับประกันว่าจะมีการสำรวจคุณสมบัติตามลำดับเดียวกับที่เพิ่มเข้ามา ซึ่งหมายความว่าการใช้งาน JavaScript ที่แตกต่างกันจะนำเสนอคุณสมบัติเดียวกันโดยใช้ลำดับที่แตกต่างกัน มันยังหมายความว่าคำสั่งซื้อเดียวกันสามารถเปลี่ยนแปลงได้ในเวอร์ชันเดียวกันของเบราว์เซอร์เดียวกัน
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors
นั้น ตามที่ฉันรายงาน$.each(Drupal.behaviors)
จะแสดงรายการวัตถุตามลำดับเดียวกับที่ใส่ไว้โดยไม่ยึดตามตัวระบุ
ใช้โมดูลWeight Weight
(โปรดให้มันทดสอบก่อนที่คุณจะใช้ในเว็บไซต์การผลิต)
โมดูลอนุญาตให้แนบตุ้มน้ำหนักกับพฤติกรรมจากนั้นมันจะจี้ / แทนที่drupal.attachBehaviors
ด้วยการใช้งานที่กำหนดเองซึ่งเกี่ยวข้องกับน้ำหนัก
ทำไมไม่ให้น้ำหนักของโมดูลแทนตามที่แนะนำในคำตอบอื่น ๆ
ดู
ลำดับของฟิลด์ในวัตถุจาวาสคริปต์ที่คาดการณ์ได้เมื่อวนลูปผ่านมันหรือไม่? และ
เพื่อ Elements - สำหรับ ( ... ใน ... ) วงใน JavaScript
สำหรับ Drupal 6 -
วิธีแก้ปัญหาง่ายๆหากไม่จำเป็นต้องพกพาคือการทำให้ JS คุณต้องการเรียกใช้ล่าสุดในไฟล์ template template.php การเรียก drupal_add_js ของธีมจะถูกเรียกหลังจากโมดูลเสมอ
หากไม่จำเป็นต้องพกพาโซลูชัน "cleanest" ใน drupal 6 คือการเพิ่มโมดูลใหม่ที่มีน้ำหนักแตกต่างจากโมดูลของคุณด้วย php คุณสามารถมีสองโมดูลในโฟลเดอร์เดียวกันทำให้โมดูลแรกขึ้นอยู่กับโมดูลแรกและปรับน้ำหนักใน hooks การติดตั้ง / อัพเดต ไม่จำเป็นต้องใช้อะไรเลยเพียงทำให้การติดตั้งง่ายขึ้น