Ответы:
Код 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; Сначала в выводе HTML появляется код JavaScript с меньшим весом. Это невозможно с Drupal 6, подумал.
JavaScript не гарантирует, что свойства просматриваются в том же порядке, в котором они были добавлены. Это означает, что разные реализации JavaScript будут представлять одни и те же свойства в другом порядке; это также означает, что один и тот же порядок может изменяться в разных версиях одного и того же браузера.
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors
; как я сообщал, $.each(Drupal.behaviors)
списки объектов в том же порядке, в котором они вставлены, не основаны на их идентификаторе.
Используйте модуль Behavior Weights .
(Пожалуйста, дайте ему некоторое тестирование, прежде чем использовать его на производственной площадке)
Модуль позволяет привязывать веса к поведению, а затем он перехватывает / заменяет drupal.attachBehaviors
пользовательскую реализацию, которая учитывает веса.
Почему бы не использовать модульный вес, как предлагается в другом ответе?
См. Предсказуем
ли порядок полей в объекте javascript при прохождении через них? и
порядок элементов - для цикла (… in…) в javascript .
Для Drupal 6 -
Простое решение, если это не нужно переносить, это поместить JS, который вы хотите запустить последним, в файл theme.php темы. Тема вызовов drupal_add_js всегда вызывается после модулей.
Если он действительно должен быть переносимым, самое «чистое» решение в drupal 6 - добавить новый модуль, который имеет другой вес, чем ваш модуль с php. Вы могли бы даже иметь два модуля в одной папке, сделать первый модуль зависимым от первого и настроить веса в хуках установки / обновления. Ничего из этого не требуется, просто облегчает установку.