30/08/2023 - alessandro.vitale ha scritto:
Tenete conto che questo script sta dentro una pagina (la prima) e il pulsante sta dentro un'altra pagina che popola la prima pagina.. ma alla fine dovrebbe trovarlo con l'id perchè al caricamento il pulsante anche se si trova dentro altra pagina comunque sarà dentro il DOM della prima pagina.
Come mi capita di fare, se ho compreso bene quel che succede, quoto me stesso:
L'unica cosa che posso dire è che bisogna stare attenti a non assegnare preventivamente via JavaScript gestori di evento (callback) a elementi della pagina che però vengono caricati solo in un secondo momento, tramite AJAX ad esempio.
Se tu carichi elementi dinamicamente nella pagina, è in quel momento che devi agganciare l'handler dell'evento.
Se scrivi qualcosa del tipo
document.getElementById("loadContentButton").addEventListener("click", function() {
e non esiste un elemento che si chiama “loadContentButton” nella pagina nel momento in cui l'istruzione viene eseguita, il click non verrà assegnato, ma questo non avverrà nemmeno in un secondo momento, ossia quando l'elemento con quell'ID verrà caricato nella pagina, a meno che non venga rieseguito questo pezzo di codice, o a meno che la gestione non avvenga in altro modo, ossia sfruttando (ad esempio) l'Event Bubbling.
In pratica, quando esegui la addEventListener() su un elemento chiamandolo per ID, l'elemento deve trovarsi nella pagina; se non c'è l'elemento, non è possibile individuarlo e quindi agganciare la gestione dell'evento. A meno che non venga forzato in qualche modo (es. chiamando una apposita funzione di “wire up” della UI), il runtime di JavaScript non si occuperà di fare questo in automatico (non avrebbe senso e sfuggirebbe al controllo). L'alternativa è quella di agganciare l'evento a un elemento che conterrà quello dinamicamente caricato, così che si possa fissare una gestione su qualcosa che nella pagina non muta (non viene tolto né aggiunto dinamicamente) occupandosi anche di trigger che provengono da elementi caricati o creati dinamicamente al suo interno.
Approfondisci questa tematica e vedi se è il tuo caso. :)
Ciao!