Конвейер ресурсов Rails: JavaScript выполняется дважды

Мой JavaScript выполняется дважды. Когда я запускаю отладчик Chrome, я заметил, что отдельный файл JavaScript будет выполнять код в первый раз, а затем файл application.js снова выполнит код.

Я считаю, что это происходит потому, что я недавно отключил предварительную компиляцию, потому что у меня были проблемы с Heroku. После этого я побежал rake assets:precompile.


person user2158382    schedule 08.07.2014    source источник


Ответы (3)


Турболинки

У вас вероятно проблема с 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
comment
Я не использую турболинки, если они автоматически не включены в рельсы 3.2.13. - person user2158382; 08.07.2014
comment
или если он не включен в bootstrap 3 - person user2158382; 08.07.2014
comment
Спасибо за отличное объяснение Ричард - person Jake Smith; 22.05.2016

У меня была такая же проблема в приложении rails 3, которое не использует турбоссылки. Я смог исправить это, запустив:

rake assets:clean

Эта ссылка помогла мне: Jquery Rails 3... форма отправляется дважды ... удаляет дважды... помощь

person Ross Fuhrman    schedule 05.11.2015

Я столкнулся с этой проблемой из-за конвейера активов, включающего как jquery, jquery-ujs, так и rails-ujs:

//= require jquery
//= require jquery_ujs
//= require rails_ujs
//= require bootstrap
//= require turbolinks
//= require_tree .

Удалил rails_ujs и все стало нормально.

person sloth-jr    schedule 06.08.2017