Rails 5: как использовать $(document).ready() с турбо-ссылками

Turbolinks предотвращает запуск обычных событий $(document).ready() во всех посещениях страниц, кроме начальной загрузки, как обсуждалось здесь и здесь. Однако ни одно из решений в связанных ответах не работает с Rails 5. Как я могу запускать код при каждом посещении страницы, как в предыдущих версиях?

Ответ 1

Вместо прослушивания события ready вам нужно подключиться к событию, запущенному Turbolinks для каждого посещения страницы.

К сожалению, Turbolinks 5 (это версия, появившаяся в Rails 5) была переписана и не использует те же имена событий, что и в предыдущих версиях Turbolinks, в результате чего ответы, упомянутые выше, терпят неудачу. Теперь вы можете прослушать turbolinks: загрузить следующее:

$( document ).on('turbolinks:load', function() {
  console.log("It works on each visit!")
})

Ответ 2

Native JS:

document.addEventListener("turbolinks:load", function() {
    console.log('It works on each visit!');
});

Ответ 3

Это мое решение, переопределить jQuery.fn.ready, затем $(document).ready работает без каких-либо изменений:

jQuery.fn.ready = (fn)->
  $(this).on 'turbolinks:load', fn

Ответ 4

Вот решение, которое работает для меня, здесь:

Ответ 5

Пока мы ждем исправления этого действительно крутого камня, я смог двигаться вперед, изменив следующее:

  addCallback: (callback) ->
if $.turbo.isReady
  callback($)
$document.on 'turbo:ready', -> callback($)

в

  addCallback: (callback) ->
if $.turbo.isReady
  callback($)
$document.on 'turbolinks:load', -> callback($)

Я еще не знаю, что это не решает, но, похоже, он хорошо работал при первоначальной проверке.

Ответ 6

В рельсах 5 самым простым решением является использование:

$(document).on('ready turbolinks:load', function() {});

Вместо $(document).ready. Работает как шарм.

Ответ 7

Используйте легкий жемчуг jquery-turbolinks.

Он делает $(document).ready() работу с Turbolinks без изменения существующего кода.

В качестве альтернативы вы можете изменить $(document).ready() на один из:

$(document).on('page:fetch', function() { /* your code here */ });

$(document).on('page:change', function() { /* your code here */ });

в зависимости от того, какой из них более уместен в вашей ситуации.

Ответ 8

Использую: $(document).on 'turbolinks:load', ->

Вместо: $(document).on('turbolinks:load', function() {...})