Turbolinks умножает привязки

У меня возникла проблема, когда Turbolinks несколько раз связывает события при использовании кнопок «назад/вперед» в браузере. У меня есть простой скрипт, чтобы убедиться, что это не так, как я писал свои события document.on(), поэтому...

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

Будет срабатывать один раз при нажатии на ссылку. Щелкнув назад или вперед (или по другой ссылке Turbolink), он сработает дважды. В следующий раз он сработает несколько раз и продолжит расти. Это единственное, что у меня есть в моем файле манифеста, кроме jQuery и Turbolinks. Как предотвратить дублирование привязок событий Turbolinks?


person Kombo    schedule 27.09.2013    source источник


Ответы (4)


Проблема, похоже, заключалась в включении javascript_tag в конец моего тела, а не в голову. В теле Javascript удалялся/добавлялся на каждой странице Turbolinks:change, поэтому привязки продолжали накапливаться.

person Kombo    schedule 28.09.2013

Это имеет смысл - та же проблема возникнет, если вы используете гем jquery-turbolinks, поскольку он заставит любой код внутри вашей функции готовности документа jQuery выполняться при каждой загрузке страницы. Поскольку объект документа никогда не инициализируется повторно с помощью Turbolinks, это приводит к избыточным привязкам. Решение для этого случая состоит в том, чтобы разместить ваши привязки $(document).on за пределами вашей готовой функции jQuery, чтобы они не выполнялись при каждой загрузке страницы.

person mwalsher    schedule 21.10.2013

У меня была та же проблема, и в основном я запрашивал, была ли переменная определена до включения JS. Немного сумбурная мысль...

person Marcos Chicote    schedule 11.02.2014
comment
Мне пришлось удалить свой тег javascript_include из тела в голову. - person Kombo; 12.02.2014
comment
Ох, хорошо. Я спросил, загружалась ли библиотека при добавлении элемента сценария. То же самое, что вы сделали бы при отступлении, но при первом включении библиотеки. Спасибо! - person Marcos Chicote; 13.02.2014

Я столкнулся с той же проблемой, и проблема заключалась в том, что разметка, которую я создавал на макете, была неправильной. Я закрывал тег body в том месте, где не должен был

person macool    schedule 06.08.2015