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

我在试图组织JS文件“rails方式”时遇到了Rails 4应用程序中的一个问题。 他们以前分散在不同的意见。 我将它们组织成单独的文件并使用资产管道进行编译。 不过,我刚刚了解到,在启用turbo链接时,jQuery的“ready”事件不会触发随后的点击。 你第一次加载一个页面它的工作。 但是当你点击一个链接时, ready( function($) {任何内容都不会被执行(因为页面实际上并没有再次加载)好解释:这里。

所以我的问题是:什么是正确的方式来确保jQuery事件正常运行,而涡轮链接? 你是否将这些脚本包装在一个Rails特定的侦听器中? 或者,也许铁轨有一些魔法,使它不必要? 这些文档对于如何工作有些模糊,尤其是在通过像application.js这样的清单载入多个文件方面。


这就是我做的... CoffeeScript:

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:load变成turbolinks:load并且在初始加载时甚至会被触发。 所以我们可以做到以下几点:

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

  ...your javascript goes here...

});

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


最近我发现了最简单易懂的处理方式:

$(document).on 'ready page:load', ->
  # Actions to do

要么

$(document).on('ready page:load', function () {
  // Actions to do
});

编辑
如果已将委托事件绑定到document ,请确保将它们附加到ready函数之外,否则它们会在每个page:load上反弹page:load事件(导致多次运行相同的函数)。 例如,如果您有任何类似的电话:

$(document).on 'ready page:load', ->
  ...
  $(document).on 'click', '.button', ->
    ...
  ...

把它们从ready函数中拿出来,像这样:

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

$(document).on 'click', '.button', ->
  ...

绑定到document委托事件不需要绑定ready事件。

链接地址: http://www.djcxy.com/p/12305.html

上一篇: Rails 4: how to use $(document).ready() with turbo

下一篇: window.onload vs $(document).ready()