Turbolinks zapobiega $(document).ready()
uruchamianiu normalnych zdarzeń podczas wszystkich wizyt na stronie poza początkowym ładowaniem, co omówiono tutaj i tutaj . Jednak żadne z rozwiązań w połączonych odpowiedziach nie działa z Railsami 5. Jak mogę uruchomić kod na każdej wizycie na stronie, tak jak w poprzednich wersjach?
84
on('ready turbolinks:load')
inaczej, mam pewne problemy na niektórych stronachNatywny JS:
document.addEventListener("turbolinks:load", function() { console.log('It works on each visit!'); });
źródło
W szynach 5 najłatwiejszym rozwiązaniem jest zastosowanie:
$(document).on('ready turbolinks:load', function() {});
Zamiast
$(document).ready
. Działa jak marzenie.źródło
ready
do listy, w przeciwnym razie funkcja zostanie wykonana dwukrotnie. Jak powiedział github.com/turbolinks/turbolinks/#observing-navigation-events , powinieneś zrobić to w następujący sposób:javascript $(document).ready(function() { $(document).on('turbolinks:load', function() {} ) })
$(document).ready
zostanie wyzwolony, to przynajmniej w moich własnych scenariuszach nie potrzebowałbymturbolinks:load
ready
wyzwalane jest tylko zdarzenie. Jeśli są turboliny, kod jest wywoływany dwukrotnieTo jest moje rozwiązanie, nadpisanie
jQuery.fn.ready
, a następnie$(document).ready
działa bez żadnych zmian:jQuery.fn.ready = (fn)-> $(this).on 'turbolinks:load', fn
źródło
document
wywołań zwrotnych. Dlaczego głos przeciw? Powinno to być bezpieczne, o ile turbolinki są używane w całej aplikacji, prawda?(Dla skryptu kawowego)
Używam:
$(document).on 'turbolinks:load', ->
Zamiast:
$(document).on('turbolinks:load', function() {...})
źródło
Oto rozwiązanie, które działa dla mnie, stąd :
zainstalować
gem 'jquery-turbolinks'
dodaj ten plik .coffee do swojej aplikacji: https://github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee
nazwij to turbolinks-compatibility.coffee
w application.js
//= require jquery //= require jquery_ujs //= require jquery.turbolinks //= require turbolinks //= require turbolinks-compatibility
źródło
production
env? Czy to przetestowałeś? Niektórzy mówią, że działa dobrze wdevelopment
trybie.Podczas gdy czekamy na naprawę tego naprawdę fajnego klejnotu, mogłem przejść do przodu, modyfikując następujące elementy;
addCallback: (callback) -> if $.turbo.isReady callback($) $document.on 'turbo:ready', -> callback($)
do:
addCallback: (callback) -> if $.turbo.isReady callback($) $document.on 'turbolinks:load', -> callback($)
Nie wiem jeszcze, czego to nie rozwiązuje, ale przy wstępnej inspekcji wydawało się, że działa dobrze.
źródło
Użyj lekkich klejnotów jquery-turbolinks .
Umożliwia
$(document).ready()
pracę z Turbolinks bez zmiany istniejącego kodu.Alternatywnie możesz zmienić
$(document).ready()
na jedną z:$(document).on('page:fetch', function() { /* your code here */ }); $(document).on('page:change', function() { /* your code here */ });
w zależności od tego, który jest bardziej odpowiedni w Twojej sytuacji.
źródło