it-swarm.com.de

Wie kann ich die Reihenfolge von Drupal.behaviors steuern?

Ich möchte, dass der JavaScript-Code von Modul X erst ausgeführt wird, nachdem der von Modul Y ausgeführt wurde. Was ist der beste Weg, dies zu tun?

9
cam8001

Der von Drupal 7) verwendete JavaScript-Code lautet wie folgt:

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 verwendet einen ähnlichen Code:

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

Wenn JavaScript garantieren würde, dass Objekt-/Array-Eigenschaften immer in derselben Reihenfolge durchlaufen werden, in der sie hinzugefügt werden, werden die Werte von jQuery.each() an die Funktion übergeben, die als zweiter Parameter in derselben Reihenfolge verwendet wird, in der sie eingefügt werden Das Array wurde als erster Parameter übergeben.
Dies würde bedeuten, dass das erste in Drupal.behaviors Eingefügte Verhalten zuerst ausgeführt wird.
In diesem Fall können Sie ein geringeres Gewicht verwenden, damit die von Ihrem Modul definierten Verhaltensweisen zuerst ausgeführt werden können. Wenn Sie möchten, dass sie vor den anderen ausgeführt werden, sollte das Modulgewicht auf -50 eingestellt werden. andere Werte können auch funktionieren. Wenn Sie Drupal 7, drupal_add_js () verwenden, können Sie dem JavaScript-Code eine Gewichtung zuordnen. JavaScript-Code mit einer geringeren Gewichtung wird zuerst in der HTML-Ausgabe angezeigt ist nicht möglich mit Drupal 6, dachte.

JavaScript garantiert nicht, dass Eigenschaften in derselben Reihenfolge durchlaufen werden, in der sie hinzugefügt wurden. Dies bedeutet, dass verschiedene JavaScript-Implementierungen dieselben Eigenschaften in einer anderen Reihenfolge aufweisen. Dies bedeutet auch, dass sich dieselbe Reihenfolge in verschiedenen Versionen desselben Browsers ändern kann.

5
kiamlaluno

Verwenden Sie das Modul Verhaltensgewichte .
(Bitte testen Sie es, bevor Sie es auf einer Produktionsstätte verwenden.)

Das Modul ermöglicht das Anhängen von Gewichten an Verhaltensweisen und entführt/ersetzt dann drupal.attachBehaviors mit einer benutzerdefinierten Implementierung, die die Gewichte berücksichtigt.


Warum nicht stattdessen das Modulgewicht, wie in der anderen Antwort vorgeschlagen?

  • das Modulgewicht ist ein ziemlich schweres Werkzeug. Es gilt für alle Hook-Implementierungen (PHP) und Verhaltensweisen (js) des Moduls, während wir nur an einem einzigen Verhalten interessiert sind.
  • die Reihenfolge der Eigenschaften in einem js-Objekt wird von der Spezifikation nicht garantiert (obwohl sie in fast allen Browsern wie erwartet implementiert ist).

Sehen
Ist die Reihenfolge der Felder in einem Javascript-Objekt prädikatierbar, wenn sie durchlaufen werden? und
Elementreihenfolge - für (… in…) Schleife in Javascript .

5
donquixote

Für Drupal 6 -

Eine einfache Lösung, wenn dies nicht portabel sein muss, besteht darin, das JS, das Sie zuletzt ausführen möchten, in die Datei theme template.php einzufügen. Aufrufe des Themas drupal_add_js werden immer nach Modulen aufgerufen.

Wenn es portabel sein muss, besteht die "sauberste" Lösung in drupal 6 darin, ein neues Modul hinzuzufügen, das ein anderes Gewicht als Ihr Modul mit dem PHP hat. Sie könnten sogar die beiden Module in der haben Machen Sie das erste Modul vom ersten abhängig und passen Sie die Gewichte in den Installations-/Update-Hooks an. Keines davon ist erforderlich, erleichtert lediglich die Installation.

0
mirzu