it-swarm.it

Come posso controllare l'ordine di Drupal.behaviors?

Voglio che il codice JavaScript del modulo X venga eseguito solo dopo che quello del modulo Y è stato eseguito. qual'è il miglior modo per farlo?

9
cam8001

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 da jQuery.each() alla funzione utilizzata come secondo parametro nello stesso ordine in cui sono inseriti l'array è passato come primo parametro.
Ciò significherebbe che il primo comportamento inserito in Drupal.behaviors Viene 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 si utilizza Drupal 7, drupal_add_js () consente di associare un peso al codice JavaScript; il codice JavaScript con un peso più leggero viene visualizzato per primo nell'output HTML. 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.

5
kiamlaluno

Utilizzare il modulo Behavior Weights .
(Prima di utilizzarlo in un sito di produzione, esegui alcuni test)

Il modulo consente di associare pesi ai comportamenti, quindi dirotta/sostituisce drupal.attachBehaviors con un'implementazione personalizzata, che rispetta i pesi.


Perché non caricare il peso del modulo, come suggerito nell'altra risposta?

  • il peso del modulo è uno strumento piuttosto pesante. Si applica a tutte le implementazioni hook (php) e comportamenti (js) del modulo, mentre siamo interessati solo a un singolo comportamento.
  • l'ordine delle proprietà in un oggetto js non è garantito dalla specifica (sebbene sia implementato come ci si aspetterebbe in quasi tutti i browser).

Vedere
L'ordine dei campi in un oggetto javascript è prevedibile quando si scorre in sequenza? e
Ordine degli elementi - per il ciclo (... in ...) in javascript .

5
donquixote

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 vengono sempre chiamate dopo i moduli.

Se ha bisogno di essere portatile la soluzione "più pulita" in drupal 6 è aggiungere un nuovo modulo che abbia un peso diverso dal tuo modulo con il php. Potresti anche avere i due moduli nel stessa cartella, fai in modo che il primo modulo dipenda dal primo e regola i pesi nei hook di installazione/aggiornamento. Nessuno dei quali è necessario, semplifica l'installazione.

0
mirzu