I ran into an issue in my Rails 4 app while trying to organize JS files "the rails way". They were previously scattered across different views. I organized them into separate files and compile them with the assets pipeline. However, I just learned that jQuery's "ready" event doesn't fire on subsequent clicks when turbo-linking is turned on. The first time you load a page it works. But when you click a link, anything inside the ready( function($) { won't get executed (because the page doesn't actually load again). Good explanation: here.

所以我的问题是:什么是确保jQuery事件在涡轮链接打开时正常工作的正确方法?您是否将脚本包装在特定于rails的侦听器中?或者也许rails有某种魔力,使它变得不必要?文档对这应该如何工作有点模糊,特别是关于通过manifest(s)加载多个文件,如application.js。


当前回答

$(document).ready(ready)  

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

其他回答

测试了这么多的解决方案,终于得出了这个结论。 你的代码肯定不会被调用两次。

var has_loaded = false; Var ready = function() { 如果(! has_loaded) { has_loaded = true; // YOURJS } } $(文档)时(准备); 美元(文档)。绑定(“页面:改变”,准备);

与其使用变量保存“ready”函数并将其绑定到事件,不如在page:load触发时触发ready事件。

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

以下是我所做的,以确保事情不会执行两次:

$(document).on("page:change", function() {
     // ... init things, just do not bind events ...
     $(document).off("page:change");
});

我发现使用jquery-turbolinks gem或组合$(document)。Ready和$(document).on("page:load")或使用$(document).on("page:change")本身的行为会出乎意料——尤其是在开发过程中。

我是这么做的… CoffeeScript:

ready = ->

  ...your coffeescript goes here...

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

最后一行监听页面加载,这是什么涡轮链接将触发。

编辑……添加Javascript版本(每个请求):

var ready;
ready = function() {

  ...your javascript goes here...

};

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

编辑2…对于Rails 5 (Turbolinks 5)页面:load变成了Turbolinks:load,甚至会在初始加载时触发。所以我们可以这样做:

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

  ...your javascript goes here...

});

你必须使用:

document.addEventListener("turbolinks:load", function() {
  // your code here
})

来自turbolinks,博士。