Як я можу контролювати порядок поведінки на Drupal.beas?


9

Я хочу, щоб код JavaScript від модуля X запускався лише після запуску одного з модуля Y. Який найкращий спосіб зробити це?

Відповіді:


5

Код 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 представляли б однакові властивості, використовуючи інший порядок; це також означає, що той самий порядок міг змінюватися в різних версіях одного і того ж браузера.


Я колись знайшов сторінку, в якій перелічено вагу, яку використовують деякі модулі. Я не пам’ятаю URL-адреси цієї сторінки, і якщо сторінка включала лише окремі модулі, або вона була вичерпною. Якщо я знайду цю сторінку, я повідомлю тут посилання.
kiamlaluno

1
Ви завжди можете лише перевірити в системній таблиці - спробуйтеselect name, weight from system where type = 'module' order by weight ASC, name
cam8001

На жаль, мені потрібен PHP (mymodule) мого модуля, щоб запуститись перед PHP іншого модуля (вертикальний_таблиці), але JS-модуля мого модуля запуститься після js вертикального_таб. Чи існує спосіб, орієнтований на Javascript, на поводження з вагою?
cam8001

@ cam8001: Я це знаю, але це означатиме, що ви повинні встановити всі модулі, щоб знати легшу вагу, яку використовує модуль. На сторінці, яку я знайшов, перелічено ваги модуля, і це може бути корисно, коли вам потрібно знати, яку вагу слід присвоїти вашому модулю для виконання перед кожним модулем. Я знаю, ви могли просто використовувати надзвичайно легку вагу, але ви б використали вагу, яка легша, ніж це потрібно.
kiamlaluno

@ cam8001: У цьому випадку немає жодного способу здійснити те, що ви намагаєтеся зробити, крім зміни порядку розташування об'єктів, що містяться в ньому Drupal.behaviors; як я повідомляв, $.each(Drupal.behaviors)перераховує об'єкти в тому ж порядку, в який вони вставлені, не спираючись на їх ідентифікатор.
kiamlaluno

5

Використовуйте модуль " Поведінкові ваги" .
(Будь ласка, дайте йому кілька тестів, перш ніж використовувати його на виробництві)

Модуль дозволяє прив'язувати ваги до поведінки, а потім він викрадає / замінює drupal.attachBehaviorsна власну реалізацію, яка поважає ваги.


Чому б замість цього не бути вагою модуля, як це запропоновано в іншій відповіді?

  • Вага модуля - досить важкий інструмент. Це стосується всіх реалізацій гака (php) та поведінки (js) модуля, тоді як нас цікавить лише одна поведінка.
  • порядок властивостей об’єкта js не гарантується специфікацією (хоча він реалізований так, як ви очікували, майже у всіх браузерах).

Див.
Чи передбачуваний порядок полів об’єкта javascript під час циклічного перегляду через них? і
Елементи порядку - для (… in…) циклу в JavaScript .


@kiam, Якби я зробив цей модуль "поведінкова вага" ("bewgt") на drupal.org, ти б приєднався до складу співслужбовця? Можливо, це буде зовсім невеликий модуль, але, мабуть, краще, ніж дозволити його поставляти з чимось іншим. У мене є вибіркова реалізація локально для D6, здається, працює.
donquixote

щойно це зробили .. тебе все одно запрошують :)
donquixote

drupal.org/node/1302126 - Сподіваюся, це буде в основі D8 :)
donquixote

Це був би цікавий модуль, але я спершу повинен оновити код деяких моїх модулів, для яких я не писав рядок коду у віках. Після цього я міг бути вільним для спільної розробки нового модуля.
kiamlaluno

Просто кажучи, люди просять випадки використання. drupal.org/node/1302126#comment-5911632
donquixote

0

Для Drupal 6 -

Просте рішення, якщо це не потрібно бути портативним, - помістити JS, який ви хочете запустити останнім, у файл теми template.php. Теми викликів drupal_add_js завжди викликаються після модулів.

Якщо це потрібно, щоб воно було портативним, "найчистішим" рішенням в drupal 6 є додавання нового модуля, який має іншу вагу, ніж ваш модуль, з php. Ви навіть можете мати два модулі в одній папці, зробити перший модуль залежним від першого та відрегулювати ваги в гачках встановлення / оновлення. Жоден з яких не потрібен, просто полегшує встановлення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.