Турболинки
У вас вероятно проблема с Turbolinks
(учитывая, что вы включили ее в свой конвейер активов); хотя может проблема не в этом.
Turbolinks предназначен для ускорения загрузки вашей страницы путем загрузки тега <body>
ваших новых страниц с помощью ajax
, сохраняя тег <head>
нетронутым. Это предназначено для того, чтобы ваше приложение загружало только тот HTML, который ему нужен, но портит JS на вашей странице.
Если ваш JS
срабатывает дважды, это может быть признаком того, что Turbolinks мешает вашему JS. Поскольку вы не включили какие-либо примеры из logs
, я не смогу предоставить вам какую-либо конкретную информацию, но вы сможете проверить это, удалив включение turbolinks
как из JS-файла layout
, так и из JS-файла манифеста application
:
#app/views/layouts/application.html.erb
= javascript_include_tag "application", "data-turbolinks-track" => false
#app/assets/javascripts/application.js
//= require turbolinks -> remove this line
Если вы это сделаете, перезапустите сервер и перезагрузите соответствующую страницу. Если он все еще возвращается с ошибочной функциональностью, это означает, что проблема не в Turbolinks (и вам следует сбросить все, что вы изменили)
--
События
Другая проблема, которая у вас может возникнуть, заключается в том, как вы вызываете/инициируете свои события. Это может быть вызвано рядом причин, но вы обязательно должны посмотреть, как вы вызываете свой JS:
#app/assets/javascripts/application.js
$(document).on("click", ".element", function(){
//your stuff here
});
Мы всегда делегируем полномочия из элемента document
в DOM сейчас. Хотя это может вызвать некоторые проблемы с ресурсами, мы обнаружили, что это делает приложения Rails намного более надежными с Asset Pipeline, поскольку позволяет вам действительно идентифицировать элементы на странице.
Если вы пытаетесь инициировать событие от одного объекта в вашей модели DOM, вы можете обнаружить, что JS «захватит» событие дважды (по какой-либо причине), что приведет к вашей проблеме. Попробуйте делегировать свои события, которые вызываются дважды
--
Функции
Наконец, проблема может быть в вашем functions
.
Если у вас есть какие-либо анонимные функции или функции для определенных событий, вы нужно будет убедиться, что они могут быть названы правильными. Вы должны сделать это, используя события страницы в JS и Turbolinks:
#app/assets/javascripts/application.js
var your_function = function() {
//stuff here
};
$(document).on("page:load ready", your_function);
person
Richard Peck
schedule
08.07.2014