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


84

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

Відповіді:


170

Замість того, щоб слухати readyподію, вам потрібно підключитись до події, яку запускає Turbolinks за кожне відвідування сторінки.

На жаль, Turbolinks 5 (це версія, яка з’являється в Rails 5) була переписана і не використовує тих самих назв подій, що й у попередніх версіях Turbolinks, через що згадані відповіді не вдаються. Зараз працює прослуховування події turbolinks: load так:

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

5
Так. Пояснили і тут. guides.rubyonrails.org/… . Позначте 5.2 Події зміни сторінки.
Indika K

3
турболінки: завантажуйте пожежі для мене локально, але не на Heroku. Я бачу свій власний код javascript у своїх скомпільованих js-ресурсах, але подія не запускається.
psparrow

це не працює добре. У мене є select2, а при зміні сторінки та назад у мене є два select2 (дубльовані)
inye

3
Незважаючи на те, що сказано в документі Rail, я використовую, on('ready turbolinks:load')інакше у мене виникають проблеми на деяких сторінках
Cyril Duchon-Doris

1
Привіт, Кирило, у мене така сама проблема, тобто потрібно запускати при початковому завантаженні сторінки, а також турболінки: load. Я поставив запитання щодо цього на SO, stackoverflow.com/questions/41421496/… . Чи маєте ви більше уявлення про те, чому це так? Ви використовуєте jquery-turbolinks (я є). Єдина хороша річ - це те, що ваш код ідемпотентний.
Оброміос


11

У рейках 5 найпростішим рішенням є використання:

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

Замість $(document).ready. Працює як шарм.


10
Не додавати readyдо списку, інакше функція буде виконана двічі. Як сказав github.com/turbolinks/turbolinks/#observing-navigation-events , ви повинні робити це так: javascript $(document).ready(function() { $(document).on('turbolinks:load', function() {} ) })
Сяохуй Чжан,

@XiaohuiZhang Ви впевнені, що це спрацює ???? Тому що якщо це $(document).readyспрацьовує, то, принаймні, за моїми власними сценаріями, мені це не знадобиться,turbolinks:load
Мілад Нозарі

@XiaohuiZhang Якщо ваш скрипт повинен працювати на сторінці з турболінками і на сторінці без, це не працюватиме на сторінці без, оскільки для виконання коду йому знадобляться події turbolinks: load
escanxr

@escanxr Працює і те, і інше, ви можете спробувати. оскільки турболінки завжди запускають подію "турболінки: завантажувати" щоразу, коли сторінка турболінків чи ні.
Сяохуй Чжан,

2
@XiaohuiZhang Я спробував з Turbolinks 5, це не спрацювало. Якщо турболінки відключені на сторінці, readyзапускається лише подія. Якщо є турболінки, код викликається двічі
escanxr

9

Це моє рішення, замінити jQuery.fn.ready, тоді $(document).readyпрацює без змін:

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

Це саме те, що мені потрібно було. Це працює для зовнішніх бібліотек, які також покладаються на documentзворотні виклики. Чому голос проти? Це повинно бути безпечним, поки турболінки використовуються протягом усього застосування, так?
Ділан Вандер Берг,

3

(Для кавового сценарію)

Я використовую: $(document).on 'turbolinks:load', ->

Замість: $(document).on('turbolinks:load', function() {...})


Я зробив це, і все ще отримую цю проблему, як сказав @inye : github.com/mkhairi/materialize-sass/issues/130 . Використання JS або кави насправді не має ніякого значення, принаймні для мене НЕ.
alexventuraio

2
Привіт, люди, що взагалі поганого в цій відповіді?
atw

Я припускаю, що це coffeescript, а не власний javascript? Я дав йому +1, тому що це саме те, що я роблю, і це працює для мене (у моєму файлі coffeescript)
Аарона,

так !, це для coffeescript :). Моєю помилкою було не вказати це
fcabanasm

2

Ось рішення, яке мені підходить, звідси :

  1. встановити gem 'jquery-turbolinks'

  2. додайте цей файл .coffee у свій додаток: https://github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee

  3. назвіть це turbolinks-compatibility.coffee

  4. на application.js

    //= require jquery
    //= require jquery_ujs
    //= require jquery.turbolinks
    //= require turbolinks
    //= require turbolinks-compatibility
    

Як щодо productionenv? Ви перевірили? Деякі люди кажуть, що це просто чудово працює в developmentрежимі.
alexventuraio

6
Самоцвіт застарів
Мауро

1

Поки ми чекаємо виправлення цієї справді крутої перлини, я зміг рухатися вперед, змінивши наступне;

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

до:

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

Я ще не знаю, що це не вирішує, але, здавалося, це добре працювало під час первинної перевірки.


-1

Використовуйте легкий самоцвіт jquery-turbolinks .

Це робить $(document).ready()роботу з Turbolinks без зміни існуючого коду.

Крім того, ви можете змінити $(document).ready()один із:

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

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

залежно від того, який з них більше підходить у вашій ситуації.


jquery-turbolinks ще не підтримує Turbolinks 5 github.com/kossnocorp/jquery.turbolinks/issues/56
AndrewH

Ви маєте рацію, @AndrewH! Сподіваємось, підтримка буде додана найближчим часом.
Вадим

2
Самоцвіт jquery-turbolinks застарів.
Натан V,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.