2013-09-27 14 views
13

Mam problem, w którym Turbolinks będzie wiązał zdarzenia kilka razy podczas używania przycisków wstecz/przewijania w przeglądarce. Mam prosty skrypt, aby upewnić się, że nie było tak, jak zostały pisać moją document.on() wydarzenia, więc ...Turbolinks Mnoży Wiązania

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

błyśnie raz po kliknięciu łącza. Kliknięcie w tył lub do przodu (lub inny link Turbolink) spowoduje wystrzelenie dwa razy. Następnym razem wystrzeli kilka razy i będzie dalej rosnąć. To jest moja jedyna rzecz, którą mam w moim pliku manifestu poza jQuery i Turbolinks. Jak zapobiec powielaniu powiązań zdarzeń przez Turbolinks?

Odpowiedz

15

Problem wydawał się dotyczyć javascript_tag na końcu mojego ciała, a nie głowy. Kiedy był w ciele, JavaScript był usuwany/dodawany na każdej stronie Turbolinksa: zmień tak, aby powiązania nadal się układały.

6

To ma sens - ten sam problem wystąpi, jeśli korzystasz z klejnotu jquery-turbolinks, ponieważ spowoduje to uruchomienie dowolnego kodu wewnątrz funkcji gotowej dokumentu jQuery przy każdym ładowaniu strony. Ponieważ obiekt dokumentu nigdy nie zostanie ponownie zainicjowany za pomocą Turbolinks, spowoduje to nadmiarowe powiązania. Rozwiązaniem tego przypadku jest umieszczenie powiązań $ (document) .on poza twoją funkcją gotową do jQuery, aby nie były wykonywane przy każdym ładowaniu strony.

0

Miałem ten sam problem iw zasadzie to, co zrobiłem, było zapytaniem, czy zmienna została wcześniej zdefiniowana, łącznie z JS. Brzmi trochę niechlujnie ...

+0

Musiałem usunąć mój tag javascript_include z ciała i do głowy. – Kombo

+0

Oh, ok. Zapytałem, czy biblioteka została załadowana podczas dodawania elementu skryptu. To samo, co zrobiłbyś na zasadzie rezerwowej, ale na pierwszym włączeniu biblioteki. Dzięki! –

0

Wpadłem na ten sam problem, a problem polegał na tym, że znaczniki, które generowałem na układzie, nie były poprawne. Zamykam tag body w miejscu, w którym nie powinienem był