Jawaban:
Kode JavaScript yang digunakan oleh Drupal 7 adalah sebagai berikut:
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 menggunakan kode serupa:
Drupal.attachBehaviors = function(context) {
context = context || document;
if (Drupal.jsEnabled) {
// Execute all of them.
jQuery.each(Drupal.behaviors, function() {
this(context);
});
}
};
Jika JavaScript akan menjamin bahwa properti objek / array selalu dilalui dalam urutan yang sama dengan yang ditambahkan, maka nilai akan diteruskan dari jQuery.each()
ke fungsi yang digunakan sebagai parameter kedua dalam urutan yang sama dengan yang dimasukkan ke dalam array yang dilewatkan sebagai parameter pertama.
Ini berarti bahwa perilaku pertama yang dimasukkan Drupal.behaviors
dijalankan terlebih dahulu.
Dalam hal ini, untuk memungkinkan perilaku yang didefinisikan oleh modul Anda dijalankan terlebih dahulu, Anda bisa menggunakan bobot yang lebih ringan untuknya. Jika Anda ingin mereka dieksekusi sebelum yang lain, bobot modul harus diatur ke -50; nilai-nilai lain juga bisa berfungsi. Jika Anda menggunakan Drupal 7, drupal_add_js ()memungkinkan untuk mengaitkan bobot dengan kode JavaScript; Kode JavaScript dengan bobot yang lebih ringan muncul pertama kali dalam output HTML. Ini tidak mungkin dengan Drupal 6, pikir.
JavaScript tidak menjamin bahwa properti dilalui dalam urutan yang sama seperti yang ditambahkan. Ini berarti bahwa implementasi JavaScript yang berbeda akan menyajikan properti yang sama menggunakan urutan yang berbeda; itu juga berarti bahwa urutan yang sama dapat berubah di berbagai versi browser yang sama.
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors
; ketika saya melaporkan $.each(Drupal.behaviors)
daftar objek dalam urutan yang sama mereka dimasukkan, bukan berdasarkan pengenal mereka.
Gunakan modul Berat Perilaku .
(Tolong beri beberapa pengujian sebelum Anda menggunakannya di situs produksi)
Modul ini memungkinkan untuk melampirkan bobot pada perilaku, dan kemudian membajak / menggantikan drupal.attachBehaviors
dengan implementasi kustom, yang benar-benar menghormati bobot.
Mengapa bukan bobot modul, seperti yang disarankan dalam jawaban lain?
Lihat
Apakah urutan bidang dalam objek javascript tidak dapat diprediksi saat melakukan perulangan? dan
Elemen pesanan - untuk (... dalam ...) loop dalam javascript .
Untuk Drupal 6 -
Solusi sederhana, jika ini tidak perlu portabel adalah dengan meletakkan JS yang ingin Anda jalankan terakhir ke file theme templat.php. Panggilan tema drupal_add_js selalu dipanggil setelah modul.
Jika memang perlu portable, solusi "terbersih" di drupal 6 adalah menambahkan modul baru yang memiliki bobot berbeda dari modul Anda dengan php. Anda bahkan dapat memiliki dua modul di folder yang sama, membuat modul pertama bergantung pada yang pertama, dan menyesuaikan bobot dalam kait instal / perbarui. Tidak ada yang diperlukan, hanya membuat instalasi lebih mudah.