Je veux que le code JavaScript du module X ne s'exécute qu'après l'exécution de celui du module Y. Quelle est la meilleure façon de procéder?
la source
Je veux que le code JavaScript du module X ne s'exécute qu'après l'exécution de celui du module Y. Quelle est la meilleure façon de procéder?
Le code JavaScript utilisé par Drupal 7 est le suivant:
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 utilise un code similaire:
Drupal.attachBehaviors = function(context) {
context = context || document;
if (Drupal.jsEnabled) {
// Execute all of them.
jQuery.each(Drupal.behaviors, function() {
this(context);
});
}
};
Si JavaScript garantit que les propriétés d'objet / tableau sont toujours parcourues dans le même ordre qu'elles sont ajoutées, alors les valeurs seront transmises de jQuery.each()
la fonction utilisée comme second paramètre dans le même ordre qu'elles sont insérées dans le tableau passé en tant que premier paramètre.
Cela signifierait que le premier comportement inséré dans Drupal.behaviors
est exécuté en premier.
Dans ce cas, pour permettre aux comportements définis par votre module d'être exécutés en premier, vous pouvez utiliser un poids plus léger pour cela. Si vous voulez qu'ils soient exécutés avant les autres, le poids du module doit être réglé sur -50; d'autres valeurs peuvent également fonctionner. Si vous utilisez Drupal 7, drupal_add_js ()permet d'associer un poids au code JavaScript; Le code JavaScript avec un poids plus léger apparaît en premier dans la sortie HTML. Ce n'est pas possible avec Drupal 6, pensa-t-il.
JavaScript ne garantit pas que les propriétés sont parcourues dans le même ordre qu'elles sont ajoutées. Cela signifie que différentes implémentations JavaScript présenteraient les mêmes propriétés en utilisant un ordre différent; cela signifie également que le même ordre peut changer dans différentes versions du même navigateur.
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors
; comme je l'ai signalé$.each(Drupal.behaviors)
répertorie les objets dans le même ordre dans lequel ils sont insérés, sans se baser sur leur identifiant.Utilisez le module Pondérations comportementales .
(Veuillez lui donner quelques tests avant de l'utiliser sur un site de production)
Le module permet d'attacher des poids aux comportements, puis il détourne / remplace
drupal.attachBehaviors
par une implémentation personnalisée, qui respecte les poids.Pourquoi ne pas moduler le poids à la place, comme suggéré dans l'autre réponse?
Voir
L'ordre des champs dans un objet javascript est-il prédictible lors de leur boucle? et
Ordre des éléments - pour (… dans…) boucle en javascript .
la source
Pour Drupal 6 -
Une solution simple, si cela n'a pas besoin d'être portable, est de placer le JS que vous souhaitez exécuter en dernier dans le fichier theme template.php. Les appels du thème drupal_add_js sont toujours appelés après les modules.
S'il a besoin d'être portable, la solution la plus "propre" de drupal 6 est d'ajouter un nouveau module qui a un poids différent de votre module avec le php. Vous pouvez même avoir les deux modules dans le même dossier, rendre le premier module dépendant du premier et ajuster les poids dans les crochets d'installation / mise à jour. Aucun n'est nécessaire, facilite simplement l'installation.
la source