Rails 4:如何使用 $(document).ready() 和 turbo-links

我在尝试以“Rails方式”组织JS文件时,在我的Rails 4应用程序中遇到了一个问题。它们以前分散在不同的视图中。我将它们组织到单独的文件中,并使用资产管道进行编译。但是,我刚刚了解到,当turbo-link打开时,jQuery的“ready”事件不会在后续点击时触发。第一次加载页面时,它可以正常工作。但是,当您单击链接时,其中的任何内容都不会执行(因为该页面实际上不会再次加载)。很好的解释:在这里ready( function($) {

所以我的问题是:确保jQuery事件在turbo-links打开时正常工作的正确方法是什么?是否将脚本包装在特定于 Rails 的侦听器中?或者也许Rails有一些魔力,使它变得不必要?文档对于这应该如何工作有点模糊,特别是关于通过应用程序.js等清单加载多个文件。


答案 1

这是我的工作...咖啡脚本:

ready = ->

  ...your coffeescript goes here...

$(document).ready(ready)
$(document).on('page:load', ready)

最后一行侦听页面加载,这是turbo链接将触发的内容。

编辑...添加 Javascript 版本(根据请求):

var ready;
ready = function() {

  ...your javascript goes here...

};

$(document).ready(ready);
$(document).on('page:load', ready);

编辑 2...对于 Rails 5 (Turbolinks 5) 变得并且甚至会在初始负载时被触发。因此,我们可以执行以下操作:page:loadturbolinks:load

$(document).on('turbolinks:load', function() {

  ...your javascript goes here...

});

答案 2

我刚刚了解到解决这个问题的另一种选择。如果您加载jquery-turbolinks gem,它将Rails Turbolinks事件绑定到事件,以便您可以以通常的方式编写jQuery。您只需在 js 清单文件中紧随其后添加即可(默认情况下:)。document.readyjquery.turbolinksjqueryapplication.js