Chcę, aby kod JavaScript z modułu X działał tylko po uruchomieniu kodu z modułu Y. Jak najlepiej to zrobić?
źródło
Chcę, aby kod JavaScript z modułu X działał tylko po uruchomieniu kodu z modułu Y. Jak najlepiej to zrobić?
Kod JavaScript używany przez Drupal 7 jest następujący:
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 używa podobnego kodu:
Drupal.attachBehaviors = function(context) {
context = context || document;
if (Drupal.jsEnabled) {
// Execute all of them.
jQuery.each(Drupal.behaviors, function() {
this(context);
});
}
};
Jeśli JavaScript zagwarantuje, że właściwości obiektów / tablic są zawsze przeglądane w tej samej kolejności, w jakiej są dodawane, wówczas wartości byłyby przekazywane jQuery.each()
do funkcji użytej jako drugi parametr w tej samej kolejności, w jakiej są wstawiane do tablicy przekazywanej jako pierwszy parametr.
Oznaczałoby to, że pierwsze wprowadzone zachowanie Drupal.behaviors
jest wykonywane jako pierwsze.
W takim przypadku, aby umożliwić wykonanie zachowań zdefiniowanych przez moduł, możesz użyć do tego mniejszej wagi. Jeśli chcesz, aby były wykonywane przed innymi, waga modułu powinna być ustawiona na -50; inne wartości też mogą działać. Jeśli używasz Drupal 7, drupal_add_js ()pozwala powiązać wagę z kodem JavaScript; Kod JavaScript o mniejszej wadze pojawia się jako pierwszy na wyjściu HTML. Nie jest to możliwe w przypadku Drupala 6, pomyślał.
JavaScript nie gwarantuje przejścia przez właściwości w tej samej kolejności, w jakiej zostały dodane. Oznacza to, że różne implementacje JavaScript prezentowałyby te same właściwości przy użyciu innej kolejności; oznacza to również, że ta sama kolejność może ulec zmianie w różnych wersjach tej samej przeglądarki.
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors
; jak zgłosiłem,$.each(Drupal.behaviors)
wyświetla listę obiektów w tej samej kolejności, w jakiej zostały wstawione, nie na podstawie ich identyfikatora.Użyj modułu Behavior Weights .
(Proszę przetestować go przed użyciem go na stronie produkcyjnej)
Moduł pozwala przypisywać wagi do zachowań, a następnie przejmuje / zastępuje
drupal.attachBehaviors
niestandardową implementacją, która szanuje wagi.Dlaczego nie zamiast tego waga modułu, jak sugerowano w drugiej odpowiedzi?
Zobacz:
Czy kolejność pól w obiekcie javascript jest przewidywalna podczas zapętlania ich? i
Kolejność elementów - dla (… w…) pętli w javascript .
źródło
Dla Drupal 6 -
Prostym rozwiązaniem, jeśli nie musi być przenośne, jest umieszczenie pliku JS, który chcesz uruchomić jako ostatni w pliku theme.php. Wywołania tematyczne drupal_add_js są zawsze wywoływane po modułach.
Jeśli musi być przenośny, „najczystszym” rozwiązaniem w drupal 6 jest dodanie nowego modułu, który ma inną wagę niż twój moduł z php. Możesz nawet mieć dwa moduły w tym samym folderze, uzależnić pierwszy moduł od pierwszego i dostosować wagi w zaczepach instalacji / aktualizacji. Żadne z nich nie jest konieczne, po prostu ułatwia instalację.
źródło