Risposte:
Il codice JavaScript utilizzato da Drupal 7 è il seguente:
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 utilizza un codice simile:
Drupal.attachBehaviors = function(context) {
context = context || document;
if (Drupal.jsEnabled) {
// Execute all of them.
jQuery.each(Drupal.behaviors, function() {
this(context);
});
}
};
Se JavaScript garantirebbe che le proprietà degli oggetti / array siano sempre attraversate nello stesso ordine in cui vengono aggiunte, i valori sarebbero passati jQuery.each()alla funzione utilizzata come secondo parametro nello stesso ordine in cui sono inseriti nell'array passato come primo parametro.
Ciò significherebbe che il primo comportamento inserito Drupal.behaviorsviene eseguito per primo.
In questo caso, per consentire che i comportamenti definiti dal modulo vengano eseguiti per primi, è possibile utilizzare un peso più leggero. Se vuoi che vengano eseguiti prima degli altri, il peso del modulo dovrebbe essere impostato su -50; anche altri valori possono funzionare. Se stai usando Drupal 7, drupal_add_js ()consente di associare un peso al codice JavaScript; Il codice JavaScript con un peso inferiore appare per primo nell'output HTML. Questo non è possibile con Drupal 6, pensato.
JavaScript non garantisce che le proprietà vengano attraversate nello stesso ordine in cui vengono aggiunte. Ciò significa che diverse implementazioni JavaScript presenterebbero le stesse proprietà usando un ordine diverso; significa anche che lo stesso ordine potrebbe cambiare in diverse versioni dello stesso browser.
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors; come ho riportato $.each(Drupal.behaviors)elenca gli oggetti nello stesso ordine in cui sono inseriti, non basandosi sul loro identificatore.
Utilizzare il modulo Pesi comportamentali .
(Si prega di fare alcuni test prima di utilizzarlo in un sito di produzione)
Il modulo consente di associare pesi ai comportamenti, quindi dirotta / sostituisce drupal.attachBehaviorscon un'implementazione personalizzata, che rispetta i pesi.
Perché non caricare il peso del modulo, come suggerito nell'altra risposta?
Vedi
È prevedibile l'ordine dei campi in un oggetto javascript quando li si scorre in sequenza? e
Elements order - per il ciclo (... in ...) in javascript .
Per Drupal 6 -
Una soluzione semplice, se non è necessario che sia portatile, è inserire il JS che si desidera eseguire per ultimo nel file template.php tema. Le chiamate a tema drupal_add_js sono sempre chiamate dopo i moduli.
Se deve essere portatile, la soluzione "più pulita" in drupal 6 è quella di aggiungere un nuovo modulo che abbia un peso diverso rispetto al modulo con il php. Potresti anche avere i due moduli nella stessa cartella, rendere il primo modulo dipendente dal primo e regolare i pesi negli hook di installazione / aggiornamento. Nessuno dei quali è necessario, semplifica l'installazione.