2015-02-09 3 views
1

Все мои .js файлы выглядеть следующим образом:Rails turbolinks JS файлы Bug

function function_name(){ 
..... 
some code 
..... 
} 
$(document).ready(function_name); 
$(document).on('page:load', function_name); 

Я использую setInterval(some_function, 7000), обработчики событий, как $(document).on('click', '.blah-blah', function(){...}). К сожалению, эти вещи звонят несколько раз, если у меня есть более одного запроса на сервер через turbolinks (с использованием сессии turbolinks). Фактически количество вызовов равно количеству запросов сервера. Например, у меня есть <button id="button"></button> и обработчик события js, обработчик выполняет столько раз, сколько запросов в сеансе turbolinks у меня есть. Это так раздражает)

Я хочу, чтобы вы узнали, как включить турбовинты и избежать множественных вызовов внутри js-файлов. Благодарю.

ответ

2

У вас есть два варианта:

  1. В коде, который делает такие вещи, как устанавливает интервал или добавляет обработчик, сначала проверьте, если интервал или обработчик уже существует, и не добавить еще один если там уже есть.

  2. Прикрепите к one of the other events from turbolinks как "page:before-change" или "page:before-unload" и удалите интервал или обработчик там.

+0

Можете ли вы объяснить, почему это происходит? Почему он выполняется несколько раз? – user1538633

+0

Не смотря конкретно на ваш код, позвольте мне дать обзорный ответ: Turbolinks оставляет загруженную в память страницу, она в основном превращает все регулярные ссылки в вызовы стиля ajax, поэтому Rails отправляет обратно только тело новой страницы, а turbolinks JS загружает это тело в существующую страницу. Это означает, что все ваши JS остаются в памяти, поэтому, если у вас был интервал, он продолжает работать. Затем ваша функция 'page: load' добавляет еще один интервал, и тогда они оба будут стрелять. – smathy

+1

Большое спасибо, это то, что я хотел услышать) – user1538633

Смежные вопросы