Відповіді:
Код 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);
});
}
};
Якщо JavaScript гарантував би, що властивості об'єкта / масиву завжди переміщуються в тому самому порядку, коли вони додаються, то значення передаються з 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)
перераховує об'єкти в тому ж порядку, в який вони вставлені, не спираючись на їх ідентифікатор.
Використовуйте модуль " Поведінкові ваги" .
(Будь ласка, дайте йому кілька тестів, перш ніж використовувати його на виробництві)
Модуль дозволяє прив'язувати ваги до поведінки, а потім він викрадає / замінює drupal.attachBehaviors
на власну реалізацію, яка поважає ваги.
Чому б замість цього не бути вагою модуля, як це запропоновано в іншій відповіді?
Див.
Чи передбачуваний порядок полів об’єкта javascript під час циклічного перегляду через них? і
Елементи порядку - для (… in…) циклу в JavaScript .
Для Drupal 6 -
Просте рішення, якщо це не потрібно бути портативним, - помістити JS, який ви хочете запустити останнім, у файл теми template.php. Теми викликів drupal_add_js завжди викликаються після модулів.
Якщо це потрібно, щоб воно було портативним, "найчистішим" рішенням в drupal 6 є додавання нового модуля, який має іншу вагу, ніж ваш модуль, з php. Ви навіть можете мати два модулі в одній папці, зробити перший модуль залежним від першого та відрегулювати ваги в гачках встановлення / оновлення. Жоден з яких не потрібен, просто полегшує встановлення.