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
事件。