Los Javascripts dirigidos al pie de página no funcionan después de las transiciones de página

He escrito un CSS para hacer que el menú del pie de página sea responsivo. Cuando navegamos a dispositivos móviles, los menús del pie de página se diseñan de manera similar a un menú hamburguesa. Por lo tanto, he escrito una función de clic en la sección Editar CSS/HTML >> /head para alternar los menús en la vista móvil.

Aquí, la función de clic funcionaba correctamente en la página de inicio de Discourse. Pero en otras páginas, como Resumen, Cuenta del Foro, etc., el script fue bloqueado. Por lo tanto, no puedo ver los submenús. Y también puedo ver el script en el código fuente del navegador.

¿Por qué se bloquea la ejecución de scripts personalizados en algunas páginas de Discourse? ¿Cuál es la solución permanente para este problema?

Discourse es una aplicación de una sola página. Por lo tanto, los scripts que agregues en la etiqueta <head> solo se ejecutarán una vez en la carga inicial de la página, a menos que utilices los hooks adecuados. Probablemente necesites ajustar tu código para agregar un escuchador de eventos en su lugar.

¿Podrías compartir tu código?

3 Me gusta

Aquí está mi script,

Probablemente haya varias formas de abordar esto, pero intentemos hacerlo de la “manera correcta” utilizando los hooks de personalización adecuados.

Cuando agregas HTML a la sección del pie de página de un tema, Discourse realiza cierto procesamiento para evitar que se desplace entre transiciones de página o cuando se agregan más elementos con desplazamiento infinito.

Se agrega como un componente custom-html aquí.

discourse/app/assets/javascripts/discourse/app/templates/application.hbs at a0bbc346cb5d5b89d1a3efdfa89869349a8b067f · discourse/discourse · GitHub

Si revisas el código del componente, verás que dispara un evento de la aplicación cuando se renderiza.

discourse/app/assets/javascripts/discourse/app/components/custom-html.js at a0bbc346cb5d5b89d1a3efdfa89869349a8b067f · discourse/discourse · GitHub

Este es el hook que necesitas usar.

¿Cómo se usa?
Hay un método en plugin-api que te permite ejecutar código cuando se dispara un evento específico de la aplicación.

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/app/lib/plugin-api.js#L507-L519

Como ya conocemos el nombre del evento, podemos usarlo de la siguiente manera:

api.onAppEvent("inserted-custom-html:footer", () => {
  // realiza tu trabajo aquí
});

Dado que este es un método de plugin-API, debes cambiar el tipo de tu etiqueta script a text/discourse-plugin de la siguiente manera:

<script type="text/discourse-plugin" version="0.8">
api.onAppEvent("inserted-custom-html:footer", () => {
  // realiza tu trabajo aquí
});
</script>

El fragmento anterior se ejecutará cada vez que se renderice el pie de página. Por lo tanto, ahora puedes hacer algo como esto:

<script type="text/discourse-plugin" version="0.8">
api.onAppEvent("inserted-custom-html:footer", () => {
  $(".footer-div #footerNavDiv").click(function () {
    console.log("evento de clic capturado");
    // realiza tu trabajo aquí para el evento de clic
  });
});
</script>

Puedes leer más sobre plugin-API aquí

5 Me gusta

¡Genial, gracias :slight_smile:!

1 me gusta