it-swarm-eu.dev

Jak mohu ovládat pořadí Drupal.behaviors?

Chci, aby se kód JavaScript z modulu X spustil až poté, co bude spuštěn kód z modulu Y. Jaký je nejlepší způsob, jak toho dosáhnout?

9
cam8001

JavaScript kód používaný Drupal 7 je následující:

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 používá podobný kód:

Drupal.attachBehaviors = function(context) {
  context = context || document;
  if (Drupal.jsEnabled) {
    // Execute all of them.
    jQuery.each(Drupal.behaviors, function() {
      this(context);
    });
  }
};

Pokud JavaScript zaručí, že vlastnosti objektu/pole budou vždy procházeny ve stejném pořadí, v jakém byly přidány, pak by hodnoty byly předány z jQuery.each() do funkce použité jako druhý parametr ve stejném pořadí, v jakém jsou vloženy do pole předáno jako první parametr.
To by znamenalo, že první chování vložené do Drupal.behaviors Se provede jako první.
V tomto případě, chcete-li, aby se chování definované vaším modulem provedlo jako první, můžete pro něj použít menší váhu. Pokud chcete, aby byly provedeny před ostatními, hmotnost modulu by měla být nastavena na -50; mohou fungovat i jiné hodnoty. Pokud používáte Drupal 7, drupal_add_js () umožňuje přiřadit váhu kódu JavaScript, JavaScriptový kód s nižší hmotností se nejprve objeví ve výstupu HTML. není možné s Drupal 6, pomyslel si).

JavaScript nezaručuje, že vlastnosti procházejí ve stejném pořadí, v jakém byly přidány. To znamená, že různé implementace JavaScriptu by představovaly stejné vlastnosti pomocí jiného pořadí; to také znamená, že stejné pořadí se může změnit v různých verzích stejného prohlížeče.

5
kiamlaluno

Použijte modul Behaviorální váhy .
(Před použitím na výrobním místě proveďte několik testů)

Modul umožňuje připojovat závaží k chování a poté unese/nahrazuje drupal.attachBehaviors s vlastní implementací, která respektuje váhy.


Proč ne namísto toho hmotnost modulu, jak je uvedeno v druhé odpovědi?

  • hmotnost modulu je docela těžký nástroj. Platí pro všechny implementace implementace (php) a chování (js) modulu, ale zajímá nás pouze jedno chování.
  • pořadí vlastností v objektu js není zárukou specifikace (ačkoli je implementováno tak, jak byste očekávali téměř ve všech prohlížečích).

Vidět
Je pořadí polí v objektu javascript předvídatelné při opakování mezi nimi? a
Pořadí prvků - pro (... in ...) smyčku v javascript .

5
donquixote

Pro Drupal 6 -

Jednoduchým řešením, pokud to nemusí být přenosné, je umístit JS, který chcete spustit jako poslední, do souboru theme.php. Volání drupal_add_js motivu jsou vždy vyvolána po modulech.

Pokud to musí být přenosné, „nejčistší“ řešení v drupal 6 = 6) je přidat nový modul, který má jinou váhu než váš modul s php. Mohli byste dokonce mít dva moduly v ve stejné složce, učinte první modul závislým na prvním a upravte závaží v instalačních/aktualizačních háčcích. Žádný z nich není nutný, pouze usnadňuje instalaci.

0
mirzu