Nous avons une fonction js qui s’exécute sur DOMContentLoaded, document.addEventListener(“DOMContentLoaded”, OURFUNCTION).
Cela fonctionne bien lorsque vous actualisez le navigateur, mais ne s’affiche jamais lorsque vous naviguez sur le site. Je suppose que c’est parce que Discourse ne charge le DOM qu’une seule fois, puis le reste est géré avec la navigation côté client, comme une SPA. Je me demande donc comment exécuter la fonction lors d’un changement de navigation dans Discourse lui-même ? Il y avait auparavant des moyens faciles de le faire via l’API des plugins, mais ces API sont obsolètes et je ne les vois plus utilisées dans aucun composant. Existe-t-il un moyen simple de le faire encore ? Ou devons-nous créer un composant entier juste pour exécuter du JavaScript lors d’un changement de navigation ? Merci.
Hmmm… Je ne suis pas sûr que cela garantisse que le contenu du DOM soit chargé, je crois que cela se déclenche lors du changement de route, ce qui est beaucoup plus tôt.
Vous devriez envisager de joindre un composant à un Plugin Outlet et de déclencher le modificateur didInsert si le chargement du DOM est important.
Si seul le changement de route est important, alors oui, onPageChange devrait suffire
onPageChange est appelé lors de la prochaine boucle d’événements, donc je pense qu’il sera toujours appelé après DOMContentLoaded dans la plupart des situations, mais je ne peux pas garantir que ce soit le cas.
Je vois des utilisations qui s’appuient sur onPageChange et font directement des choses avec des éléments DOM. D’où est déclenché l’événement routeDidChange d’ailleurs (EDIT : il vient d’ember : RouterService | 6.7.0 | Ember API Documentation ) ?
Je suis d’accord avec le modificateur didInsert, vraiment ingénieux !
Merci. J’ai lu la documentation en détail et, conformément à mes commentaires et à un suivi d’un membre de Discourse, l’API des plugins est obsolète et sera bientôt dépréciée. Donc, bien que votre code puisse fonctionner maintenant, il cessera bientôt de fonctionner, je pense lors de futures mises à jour. C’est pourquoi je cherche une meilleure solution. Il semble excessif de créer un composant Glimmer pour cela, j’espérais donc qu’il existait un autre événement que nous pourrions utiliser.
Soit dit en passant, nous l’avons testé avec api.OnPageChange et cela fonctionne bien. Nous n’avons pas encore rencontré de cas où le contenu du DOM n’était pas disponible lors de l’appel à OnPageChange, il semble donc qu’il soit déclenché après DomContentLoaded. Mais, je ne peux pas être sûr à 100 %. Merci pour votre aide à ce sujet.
Ah, d’accord, c’est donc une fonctionnalité d’Ember et pas lié à Discourse ? La seule partie du code qui est vraiment liée à “Discourse” serait le pluginoutlet ?