Rails 5:为什么javascript执行两次?

时间:2016-10-15 01:30:22

标签: 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的链接,然后链接回索引我希望看到:

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

但相反,我得到了第三条消息两次:

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

为什么我的javascript在第二次访问索引时执行了两次,是否有更好的方法来设置特定于页面的javascript以避免执行两次?

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

这是由于重新访问页面时显示预览的turbolinks引起的。我的理解是turbolinks会短暂地显示预览,以改善感知的加载时间,然后替换它。在我的示例中,Javascript在显示预览时执行,并在更换时再次执行。

在我的场景中,两次执行javascript并没有造成任何不良副作用,但如果是这样,可以通过使用以下documentation禁用预览来停止它:

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