80

当我在 rails 中使用 link_to 帮助程序时,我在加载我的 javascript 时遇到了一些问题。当我手动输入带有 'localhost:3000/products/new' 的 url 或重新加载页面时,javascript 会加载,但是当我通过如下所示的链接时,jQuery$(document).ready不会加载到新页面上。

Link_to,当我单击此链接时,javascript 不会加载:

<%= link_to "New Product", new_product_path %>

products.js 文件

$(document).ready(function() {
    alert("test");
});

任何帮助将非常感激。提前致谢!

4

8 回答 8

142

你在使用 Rails 4 吗?(通过rails -v在您的控制台中进行查找)

这个问题可能是由于新添加的Turbolinks gem。它使您的应用程序表现得像一个单页 JavaScript 应用程序。它有一些好处(它更快),但不幸的是它破坏了一些现有的事件,比如$(document).ready()因为页面永远不会重新加载。这可以解释为什么 JavaScript 在您直接加载 URL 时有效,但在您通过link_to.

这是关于 Turbolinks的RailsCast 。

有几个解决方案。你可以使用jquery.turbolinks作为一个插入式修复,或者你可以切换你的$(document).ready()语句来代替使用 Turbolinks'page:change'事件:

$(document).on('page:change', function() {
    // your stuff here
});

或者,您可以执行以下操作以与常规页面加载以及 Turbolinks 兼容:

var ready = function() {
    // do stuff here.
};

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

如果您使用的是 Ruby on Rails >5(您可以通过rails -v在控制台中运行来检查),请使用'turbolinks:load'而不是'page:change'

$(document).on('turbolinks:load', ready); 
于 2013-07-11T17:55:05.590 回答
66

我遇到了同样的问题,但jquery.turbolinks没有帮助。我注意到我必须重写 GET 方法。

有我的样本:

<%= link_to 'Edit', edit_interpreter_path(@interpreter), method: :get %>
于 2014-06-13T17:46:03.917 回答
25

如果你在 rails 5 而不是'page:change'你应该'turbolinks:load'这样使用:

$(document).on('turbolinks:load', function() {
  // Should be called at each visit
})

来源:https ://stackoverflow.com/a/36110790

于 2016-07-26T20:58:03.120 回答
5

您还可以使用指定 data-no-turbolink 的 div 包装您的链接。

例子:

<div id="some-div" data-no-turbolink>
    <a href="/">Home (without Turbolinks)</a>
</div>

来源:https ://github.com/rails/turbolinks

于 2015-07-03T00:18:33.797 回答
3

确保您没有任何内联<script>标签。(内联脚本标签对 turbolink 不好)。

于 2015-11-11T18:21:40.633 回答
3

FWIW,来自Turbolinks 文档,更适合捕获的事件而不是$(document).readyis page:change

page:load有一个警告,它不会在缓存重新加载时触发......

一个新的 body 元素已加载到 DOM 中。在部分替换或从缓存中恢复页面时不会触发,以免在同一个正文上触发两次。

而且由于Turbolinks只是切换视图,page:change更合适。

于 2016-02-20T02:45:50.353 回答
0

解决我的问题的解决方案是添加这个元属性。

<meta name="turbolinks-visit-control" content="reload">

这确保了对某个页面的访问将始终触发完全重新加载。

这对于解决我遇到的问题的解决方案非常有用,https://github.com/turbolinks/turbolinks#reloading-when-assets-change

于 2019-11-30T16:38:22.180 回答
-1

如果您的 link_to js 在重新加载后正常工作,那么它应该是一个 turbolink 问题,您可以false在该 link_to 上使用 turbolink,例如:

<%= link_to "Home", home_path, data: { turbolinks: false } %>
于 2021-12-29T06:39:10.633 回答