Javascript che puntano al footer non funzionano dopo le transizioni di pagina

Ho scritto un CSS per rendere responsivo il menu del footer. Quando si passa a dispositivi mobili, i menu del footer sono progettati in modo simile a un menu hamburger. Quindi ho scritto una funzione di click nella sezione Modifica CSS/HTML >> /head per attivare/disattivare i menu nella visualizzazione mobile.

Qui la funzione di click funzionava correttamente sulla home page di Discourse. Ma su alcune altre pagine come Riepilogo, Account Forum, ecc., lo script veniva bloccato. Quindi non riesco a vedere i sottomenu. Inoltre, riesco a vedere lo script anche nel sorgente del browser.

Perché l’esecuzione degli script personalizzati viene bloccata su alcune pagine di Discourse? Qual è la soluzione permanente per questo problema?

Discourse è un’applicazione a pagina singola. Quindi, gli script che aggiungi nel tag <head> vengono eseguiti solo una volta al caricamento iniziale della pagina, a meno che tu non utilizzi gli hook corretti. Probabilmente devi modificare il tuo codice per aggiungere un listener degli eventi.

Puoi condividere il tuo codice?

3 Mi Piace

Ecco il mio script,

Ci sono probabilmente diversi modi per risolvere questo problema, ma proviamo il metodo ‘corretto’ utilizzando gli appositi hook di personalizzazione.

Quando aggiungi HTML alla sezione footer di un tema, Discourse esegue alcune operazioni di gestione per evitare che l’elemento si sposti durante le transizioni tra le pagine o quando vengono aggiunti altri elementi tramite lo scroll infinito.

Viene aggiunto come componente custom-html qui:

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

Se esamini il codice del componente, vedrai che viene generato un evento dell’applicazione quando viene renderizzato.

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

Questo è l’hook che devi utilizzare.

Come si usa?
Esiste un metodo in plugin-api che ti permette di eseguire codice quando viene generato un specifico evento dell’applicazione.

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

Poiché conosciamo già il nome dell’evento, possiamo utilizzarlo nel seguente modo:

api.onAppEvent("inserted-custom-html:footer", () => {
  // esegui qui il tuo lavoro
});

Poiché si tratta di un metodo della plugin-API, devi cambiare il tipo del tag script in text/discourse-plugin come mostrato qui:

<script type="text/discourse-plugin" version="0.8">
api.onAppEvent("inserted-custom-html:footer", () => {
  // esegui qui il tuo lavoro
});
</script>

Il frammento sopra verrà eseguito ogni volta che il footer viene renderizzato. Quindi, ora puoi fare qualcosa del genere:

<script type="text/discourse-plugin" version="0.8">
api.onAppEvent("inserted-custom-html:footer", () => {
  $(".footer-div #footerNavDiv").click(function () {
    console.log("evento click catturato");
    // esegui qui il tuo lavoro per l'evento click
  });
});
</script>

Puoi leggere ulteriori informazioni sulla plugin-API qui

5 Mi Piace

Fantastico, grazie :slight_smile:

1 Mi Piace