Quero que o código JavaScript do módulo X seja executado somente depois que o código do módulo Y for executado. Qual é a melhor forma de fazer isso?
fonte
Quero que o código JavaScript do módulo X seja executado somente depois que o código do módulo Y for executado. Qual é a melhor forma de fazer isso?
O código JavaScript usado pelo Drupal 7 é o seguinte:
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 usa código semelhante:
Drupal.attachBehaviors = function(context) {
context = context || document;
if (Drupal.jsEnabled) {
// Execute all of them.
jQuery.each(Drupal.behaviors, function() {
this(context);
});
}
};
Se o JavaScript garantir que as propriedades do objeto / matriz sempre sejam atravessadas na mesma ordem em que foram adicionadas, os valores serão transferidos jQuery.each()
para a função usada como segundo parâmetro na mesma ordem em que são inseridos na matriz passada como primeiro parâmetro.
Isso significa que o primeiro comportamento inserido Drupal.behaviors
é executado primeiro.
Nesse caso, para permitir que os comportamentos definidos pelo seu módulo sejam executados primeiro, você pode usar um peso menor para isso. Se você deseja que eles sejam executados antes dos outros, o peso do módulo deve ser definido como -50; outros valores também podem funcionar. Se você estiver usando o Drupal 7, drupal_add_js ()permite associar um peso ao código JavaScript; O código JavaScript com menor peso aparece primeiro na saída HTML. Isso não é possível com o Drupal 6, pensou.
O JavaScript não garante que as propriedades sejam percorridas na mesma ordem em que foram adicionadas. Isso significa que diferentes implementações de JavaScript apresentariam as mesmas propriedades usando uma ordem diferente; isso também significa que a mesma ordem pode mudar em versões diferentes do mesmo navegador.
select name, weight from system where type = 'module' order by weight ASC, name
Drupal.behaviors
; como relatei,$.each(Drupal.behaviors)
lista os objetos na mesma ordem em que são inseridos, sem basear-se no identificador.Use o módulo Comportamentos .
(Faça alguns testes antes de usá-lo em um site de produção)
O módulo permite anexar pesos aos comportamentos e, em seguida, sequestra / substitui
drupal.attachBehaviors
por uma implementação personalizada, que respeita os pesos.Por que não o peso do módulo, como sugerido na outra resposta?
Consulte
A ordem dos campos em um objeto javascript é previsível ao fazer um loop entre eles? e
Elementos de ordem - para (… in…) loop em javascript .
fonte
Para Drupal 6 -
Uma solução simples, se isso não precisar ser portátil, é colocar o JS que você deseja executar por último no arquivo template.php do tema. As chamadas drupal_add_js do tema são sempre chamadas após os módulos.
Se precisar ser portátil, a solução "mais limpa" no drupal 6 é adicionar um novo módulo com peso diferente do seu módulo com o php. Você pode até ter os dois módulos na mesma pasta, tornar o primeiro módulo dependente do primeiro e ajustar os pesos nos ganchos de instalação / atualização. Nada disso é necessário, apenas facilita a instalação.
fonte