Comportements d'attachement de Drupal: réagir sur tout le contenu nouvellement chargé?


12

J'ai deux modules différents qui, à bien des égards, fonctionnent ensemble. Une des choses sur lesquelles ils travaillent ensemble est que le module A charge le contenu via AJAX et que le module B doit attacher des écouteurs d'événements au contenu chargé.

Cependant, il semble que lorsque le contenu est chargé via AJAX par le module A, seule la fonction «attach» de Drupal.behaviours.a est invoquée, et non la fonction «attach» de Drupal.behaviours.b . Les deux fonctions sont invoquées lors du chargement de la page, mais pas lors du chargement de contenu AJAX ultérieur.

// This runs every time module A loads new content.
Drupal.behaviors.a = {
  attach: function(context, settings) {
    alert('a:attach');
  }
}

// This only runs on page load, but never when module A loads new content.
Drupal.behaviors.b = {
  attach: function(context, settings) {
    alert('b:attach');
  }
}    

Comment puis-je exécuter la fonction «attach» de Drupal.behaviours.b à chaque fois qu'un module charge un nouveau contenu?


Avez-vous essayé d'ajouter Drupal.attachBehaviors();au rappel de succès ajax?
Clive

Non, mais cela ne devrait-il pas être réglé automatiquement? Je pensais que c'était l'idée de la fonction «attacher»; qu'il devrait être appelé lors du chargement de la page et de la mise à jour de la page? Il semble cependant que seule la fonction «attach» du module appelant soit appelée lors de la mise à jour de la page?
sbrattla

C'était ma compréhension, oui, je ne l'ai cependant jamais approfondi. Je sais qu'il y a eu des moments où, après un appel AJAX, j'ai eu besoin de rattacher des comportements, j'ai donc supposé que c'était nécessaire
Clive

En regardant drupal.js: "Drupal.attachBehaviors est ajouté ci-dessous à l'événement jQuery ready et s'exécute donc lors du chargement initial de la page. Les développeurs implémentant AHAH / Ajax dans leurs solutions doivent également appeler cette fonction une fois le nouveau contenu de la page chargé, alimentant un élément à traiter, afin d'attacher tous les comportements au nouveau contenu. " Il semble que je doive invoquer les attachBehaviours moi-même. Mais; cela m'intrigue que la fonction «attach» du module A fonctionne même si je n'ai pas invoqué attachBehaviours dans le rappel de succès AJAX ...? Pourquoi juste pour le module appelant, et pas tous les modules?
sbrattla

1
Si vous voulez une solution fourre-tout fonctionnera $('body').ajaxSuccess(Drupal.attachBehaviors);probablement
Clive

Réponses:


4

Ceci, à partir des commentaires misc/drupal.js, explique comment cela est censé fonctionner:

  • Drupal.attachBehaviors est ajouté ci-dessous à l'événement prêt jQuery et ainsi
  • s'exécute au chargement initial de la page. Les développeurs implémentant AHAH / Ajax dans leur
  • les solutions doivent également appeler cette fonction après que le nouveau contenu de la page a été
  • chargé, alimentant un élément à traiter, afin de fixer tous les
  • comportements au nouveau contenu.

2

Essayez d'ajouter ceci dans Drupal.behavior.b:

Drupal.attachBehaviors($(this));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.