2013-09-27 8 views
13

Sto riscontrando un problema in cui Turbolinks associa gli eventi più volte quando si utilizzano i pulsanti Indietro/Avanti tramite il browser. Ho un semplice script per assicurarsi che non era il modo in cui ho scritto il mio document.on) eventi (, quindi ...Turbolinks Moltiplicazioni binding

$(document).on 'page:load', -> 
    alert 'Loaded' 

spareranno una volta quando si fa clic su un link. Cliccando indietro o avanti (o un altro collegamento Turbolink), sparerà due volte. La prossima volta sparerà un sacco di volte e continua a crescere. Questa è la mia unica cosa che ho nel file manifest fuori da jQuery e Turbolinks. Come si impedisce a Turbolinks di duplicare i binding di eventi?

risposta

15

Il problema sembrava includere il javascript_tag alla fine del mio corpo, piuttosto che la testa. Quando nel corpo, Javascript veniva rimosso/aggiunto ogni pagina di Turbolinks: cambia in modo che i binding continuassero ad accumularsi.

6

Questo ha senso: lo stesso problema si verificherà se si utilizza la gemma jquery-turbolinks, poiché causerà l'esecuzione di qualsiasi codice all'interno della funzione pronta per jQuery per il caricamento di ogni pagina. Poiché l'oggetto del documento non viene mai reinizializzato con Turbolinks, ciò comporta binding ridondanti. La soluzione per questo caso è posizionare il tuo $ (documento) .nelle associazioni al di fuori della tua funzione jQuery ready in modo che non vengano eseguite su ogni caricamento della pagina.

0

Ho avuto lo stesso problema e in sostanza quello che ho fatto è stato interrogare se una variabile è stata definita prima di includere JS. Sembra un po 'complicato il pensiero ...

+0

Ho dovuto rimuovere il mio tag javascript_include dal corpo e nella testa. – Kombo

+0

Oh, ok. Ho chiesto se la libreria è stata caricata durante l'aggiunta dell'elemento di script. Lo stesso che avresti fatto con una strategia di riserva, ma con la prima inclusione in biblioteca. Grazie! –

0

Mi sono imbattuto nello stesso problema e il problema era che il markup che stavo generando sul layout non era corretto. Stavo chiudendo il tag body in un posto che non dovrei