我试图组织JS文件"the rails way"时,在我的Rails 4应用程序中遇到了一个问题 . 他们以前分散在不同的观点中 . 我将它们组织成单独的文件,并使用资产管道进行编译 . 但是,我刚刚了解到,当启用turbo-linked时,jQuery 's 1180518 event doesn' t会触发后续点击 . 第一次加载页面时它可以工作 . 但是当你点击一个链接时, ready( function($) {
中的任何内容实际上都会重新加载't get executed (because the page doesn' . 好解释:here .
所以我的问题是:在启用turbo-links时,确保jQuery事件正常工作的正确方法是什么?您是否将脚本包装在特定于Rails的侦听器中?或者也许rails有一些魔力让它变得不必要?文档对于它应该如何工作有点模糊,特别是关于通过像application.js这样的清单加载多个文件 .
19 回答
根据新的rails guides,正确的方法是执行以下操作:
或者,在coffeescript中:
不要听事件
$(document).ready
,只会触发一个事件 . 没有惊喜,不需要使用 jquery.turbolinks 宝石 .这适用于导轨4.2及以上,而不仅仅是导轨5 .
NOTE: See @SDP's answer for a clean, built-in solution
我把它固定如下:
通过更改include顺序,确保在包含其他应用程序相关js文件之前包含application.js,如下所示:
定义一个处理
application.js
中绑定的全局函数现在你可以绑定像:
以上都不适用于我,我通过不使用jQuery的$(document).ready来解决这个问题,但是使用addEventListener .
要么使用
或者使用jQuery的.on函数来实现相同的效果
有关详细信息,请参阅此处:http://srbiv.github.io/2013/04/06/rails-4-my-first-run-in-with-turbolinks.html
而不是使用变量来保存"ready"函数并将其绑定到事件,您可能希望在
page:load
触发时触发ready
事件 .这是我为确保事情不执行两次所做的工作:
我发现使用
jquery-turbolinks
gem或组合$(document).ready
和$(document).on("page:load")
或使用$(document).on("page:change")
本身表现出意外 - 特别是如果你正在开发中 .这就是我做的...... CoffeeScript:
最后一行侦听页面加载,这是turbo链接将触发的内容 .
Edit ...添加Javascript版本(每个请求):
Edit 2 ...对于Rails 5(Turbolinks 5)
page:load
变为turbolinks:load
,甚至会在初始加载时触发 . 所以我们可以做到以下几点:我刚学会了解决这个问题的另一种选择 . 如果你加载the jquery-turbolinks gem它会将Rails Turbolinks事件绑定到
document.ready
事件,这样你就可以用通常的方式编写你的jQuery . 您只需在jquery
之后在js清单文件中添加jquery.turbolinks
(默认情况下:application.js
) .最近我找到了最简洁易懂的处理方式:
OR
EDIT
如果delegated events绑定到
document
,请确保将它们附加到ready
函数之外,否则它们将在每个page:load
事件上反弹(导致相同的函数多次运行) . 例如,如果您有任何这样的调用:将它们从
ready
函数中取出,如下所示:绑定到
document
的委托事件不需要绑定到ready
事件 .在Rails 4 documentation中找到了这个,类似于DemoZluk的解决方案,但略短:
要么
如果你有调用
$(document).ready()
的外部脚本,或者如果你不能重写所有现有的JavaScript,那么这个gem允许你继续使用$(document).ready()
和TurboLinks:https://github.com/kossnocorp/jquery.turbolinks我发现以下article对我来说非常有用,并详细介绍了以下内容的使用方法:
我想我会把这个保留在这里升级到Turbolinks 5:修复代码的最简单方法是:
至:
参考:https://github.com/turbolinks/turbolinks/issues/9#issuecomment-184717346
你必须使用:
from turbolinks doc .
也许你可以像这样使用“准备好”,就像关闭你的turbolink一样 .
首先,安装
jquery-turbolinks
gem . 然后,不要忘记将包含的Javascript文件从application.html.erb
的正文末尾移动到<head>
.作为described here,如果您已将应用程序javascript链接放在页脚中以达到速度优化的原因,则需要将其移动到标记中,以便在标记中的内容之前加载 . 这个解决方案对我有用 .
经过测试,这么多解决方案终于来了 . 这很多代码绝对不会被调用两次 .
我通常为我的rails 4项目做以下事情:
在
application.js
然后在其余的.js文件中,而不是使用
$(function (){})
我调用onInit(function(){})