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?
quelle
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?
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 in derselben Reihenfolge jQuery.each()
an die Funktion übergeben, die als zweiter Parameter verwendet wird, in der sie in das als erster Parameter übergebene Array eingefügt werden.
Dies würde bedeuten, dass das erste eingefügte Verhalten Drupal.behaviors
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 verwenden, wird drupal_add_js ()Ermöglicht das Zuordnen einer Gewichtung zum JavaScript-Code. JavaScript-Code mit einem geringeren Gewicht wird zuerst in der HTML-Ausgabe angezeigt. Dies ist mit Drupal 6 nicht möglich.
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.
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors
. Wie ich berichtet habe, werden$.each(Drupal.behaviors)
die Objekte in derselben Reihenfolge aufgelistet, in der sie eingefügt werden, ohne auf ihrer Kennung zu basieren.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 es dann
drupal.attachBehaviors
durch eine benutzerdefinierte Implementierung, die die Gewichte berücksichtigt.Warum nicht stattdessen das Modulgewicht, wie in der anderen Antwort vorgeschlagen?
Siehe
Ist die Reihenfolge der Felder in einem Javascript-Objekt beim Durchlaufen dieser Felder prädikatierbar? und
Elemente bestellen - for (… in…) Schleife in Javascript .
quelle
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. Die 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 hat als Ihr Modul mit dem PHP. Sie können sogar die beiden Module im selben Ordner haben, das erste Modul vom ersten abhängig machen und die Gewichte in den Installations- / Update-Hooks anpassen. Nichts davon ist notwendig, erleichtert nur die Installation.
quelle