Что может быть лучше для инициализации плагинов jquery на кнопке возврата браузера, которые не просто преобразуют элементы при использовании турболинков в Rails 5, таких как masterslider (фотогалерея) или slick (карусель), чем перезагрузка страницы, как я делаю ниже?
document.addEventListener 'turbolinks:load', ->
slickElementsPresent = $('.event-card').find('div.slick-slide')[0]
if slickElementsPresent?
window.location.reload();
else
$('.event-card').each ->
$(@).not('.slick-initialized').slick {
infinite: false,
nextArrow: $(@).find('.event-more-details-button'),
prevArrow: $(@).find('.event-card-slide-back-button')
}
Для ясности, я проверяю на странице 'turbolinks: load', есть ли какие-либо элементы html, которые будут присутствовать только в том случае, если плагин был инициализирован, если да, то обновите страницу, потому что, хотя элементы есть, плагин не не инициализирован. А затем я инициализирую плагин для всех элементов, у которых есть нужный мне класс.
Некоторые люди столкнулись с этой проблемой здесь: https://github.com/turbolinks/turbolinks/issues/106 где кто-то указывает
Я просто хочу добавить для тех, у кого есть похожие проблемы, что создание идемпотентной функции инициализации не обязательно является решением в некоторых обстоятельствах. Сделав это с помощью dataTables, я смог избежать дублирования элементов. Однако кэшированные версии элементов на странице, относящиеся к плагину, больше не работают при обратном щелчке браузера, поскольку кажется, что плагин не инициализируется на кэшированной странице.
Перезагрузка страницы, если плагин уже изменил DOM, потому что он извлекается из кеша, когда кто-то нажимает кнопку «Назад», кажется довольно плохим, но это лучшее, что я придумал, поэтому я обращаюсь к миру за новыми идеями. !
ОБНОВИТЬ:
Итак, некоторые плагины jquery имеют отличные методы 'отменить' / 'уничтожить', и в этом случае лучше добавить прослушиватель событий на "turbolinks:before-cache"
, а затем вызвать этот метод следующим образом:
document.addEventListener "turbolinks:before-cache", ->
$('.event-card').each ->
$(@).slick('unslick');
но некоторые плагины jquery не имеют функций уничтожения или функций уничтожения, которые достигают этого. Как и у masterslider есть функция $('your-slider-element').masterslider('destroy')
, но он не «отменяет» магию javascript, которую он применяет к вашему HTML, а просто полностью избавляется от него, и поэтому, когда вы возвращаетесь на страницу из браузера, кнопка назад или вперед, ползунок просто не существует, потому что элемент html, по которому он запускается, был уничтожен. Это означает, что для некоторых плагинов лучший ответ, который у меня еще есть, - это полностью перезагрузить страницу, когда страница, на которой они находятся, перемещается с помощью кнопок браузера назад и вперед.