Rails 5: почему javascript выполняется дважды?

#javascript #ruby-on-rails #ruby-on-rails-5

#javascript #ruby-on-rails #ruby-on-rails-5

Вопрос:

Я нахожусь в процессе изучения Rails и борюсь с лучшими практиками в отношении javascript для конкретной страницы. Даже при таком простом подходе turbolinks (я полагаю) заставляет javascript выполняться дважды, если я посещаю страницу, а затем возвращаюсь к ней.

Чтобы упростить сценарий, я создал новый проект с двумя действиями контроллера и запустил сервер.

 rails new jstest
cd jstest
rails g controller home index index2
rails server
 

Теперь я обновил представления следующим образом:

index.html.erb:

 <%= link_to "Index2", home_index2_path %>
<script>
  console.log("hi from index!");
</script>    
 

index2.html.erb:

 <%= link_to "Index", home_index_path %>
<script>
  console.log("hi from index2!");
</script>
 

Перейдя в /home/index, перейдя по ссылке на index2, затем по ссылке обратно на index, которую я ожидал увидеть:

 hi from index!
hi from index2!
hi from index!
 

Но вместо этого я дважды получаю третье сообщение:

 hi from index!
hi from index2!
hi from index!
hi from index!
 

Почему мой javascript выполняется дважды при втором посещении index, и есть ли лучший способ настроить javascript для конкретной страницы, чтобы избежать его выполнения дважды?

Спасибо за вашу помощь.

Ответ №1:

Это было вызвано тем, что turbolinks отображали предварительный просмотр при повторном посещении страницы. Насколько я понимаю, turbolinks кратко отображает предварительный просмотр, чтобы улучшить воспринимаемое время загрузки, а затем заменяет его. В моем примере Javascript выполняется как при отображении предварительного просмотра, так и снова при его замене.

В моем сценарии выполнение javascript дважды не вызывало никаких побочных эффектов, но если бы это было так, его можно было бы остановить, отключив предварительный просмотр следующим образом, согласно их документации:

 <head>
  ...
  <meta name="turbolinks-cache-control" content="no-preview">
</head>
 

Комментарии:

1. Спасибо, я так долго разбирался в этом. Я не знал, что Turbolinks это сделал!