如何在特定页面禁用Turbolinks?

23

我遇到了一个问题,只有当刷新页面时脚本才能正常工作,所以我试图仅在该页面禁用Turbolinks。下面的代码不起作用。但是,如果我直接将"data-no-turbolink"属性添加到application.html.erb中的body标签中,它就可以正常工作。如何在我的视图中禁用Turbolinks?我按照此处发布的解决方案进行操作:Rails 4: disable Turbolinks in a specific page ,但我无法让它起作用。

我已安装'jquery-turbolinks'宝石。

policy.html.erb

<% content_for :body do %>
 <% if controller.controller_name == 'pages' && controller.action_name == 'policy' %>
  <body data-no-turbolink="true">
 <% end %>
<% end %>

<div class="row">
 <div class="small-12 medium-8 large-7 columns end">
  <a href="//www.com/" class="nostyle" title="Policy">Policy</a>
  <script>(function (w,d) {var loader = function () {var s = d.createElement("script"), tag = d.getElementsByTagName("script")[0]; s.src = "//cdn.java.com/java.js"; tag.parentNode.insertBefore(s,tag);}; if(w.addEventListener){w.addEventListener("load", loader, false);}else if(w.attachEvent){w.attachEvent("onload", loader);}else{w.onload = loader;}})(window, document); 
  </script>
 </div>
</div>

在 Turbolinks 5 中使用 data-turbolinks="false" - maicher
6个回答

26
您可以在您的布局中使用此单行代码:
<body <%= "data-no-turbolinks='true'".html_safe if controller_name=="pages" && action_name=="policy" %>>

但另一种方法是我大多使用的,就是将这一段代码放到链接指向此页面的位置...

因此,假设你的路由被命名为:policy,你应该这样做:

<%= link_to "Policy", policy_path, :"data-no-turbolink" => true %>

很久没有更新了,这里有最新的内容

最近,我开始使用turbolinks 5.0 beta,方法如下:

gem 'turbolinks', '~> 5.0.0.beta'

它变得更容易了... 所有的document ready javascript都会被加载,没有问题... 你需要做的就是添加一个监听器来监听load事件。

$(document).on('turbolinks:load', named_function );
var named_function = function() {
    // thinks to do on document load
}

您不需要额外添加

$(document).ready(function (){
     // stuff
});
或者
$(document).ready(named_function);

因为Turbolinks如果页面被硬重载,将优雅地回退到文档加载


1
如果您使用CoffeeScript,只需将常见的第一行$ ->替换为$(document).on 'turbolinks:load', ->即可。 - sequielo
1
<%= link_to "策略", policy_path, data: {'no-turbolink' => true} %> - nilid
这对于TL5仍然有效吗? - Brad
@brad,答案的下半部分基本上就是这样。 - Ruby Racer
1
那并没有禁用它,那只是钩入了加载事件? - Brad
显示剩余3条评论

16

对于 Turbolinks 5,如果您使用了上述提到的方法:

    <%= link_to "Policy", policy_path, :"data-no-turbolink" => true %>

你需要将它更改为:

    <%= link_to "Policy", policy_path, :"data-turbolinks" => false %>

2
在HAML中,它需要是 :'data-turbolinks' => 'false' - haffla
这就是为什么我有时候讨厌stackoverflow。过时/旧版本的答案却有更多的赞,并且仍被标记为“最佳答案”。感谢Thomas对turbolinks5的澄清! - BinaryButterfly

8

我尝试了这里提到的其他方法,但都不起作用,但从Turbolinks 5文档中可以看到,您可以在想要始终加载而没有Turbolinks的页面上插入此元标记。

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

将数据属性添加到所有链接意味着您必须知道所有这些链接的位置,如果您有用户创建内容中可能存在内联链接的情况,则此方法不稳定。
对于我来说,body标签数据属性方法并没有按照我的期望工作 - 我原以为加载支持turbolinks的页面,然后单击链接以转到您想要禁用turbolinks的页面将导致完整的标准页面加载。但事实并非如此,特别是在使用后退按钮或历史记录导航时。
添加此元标记会强制Turbolinks 5在尝试将任何内容插入dom之前执行完整的页面重新加载。您将获得空白页面的经典闪烁效果,但如果像我一样使用需要在Turbolinks干扰下无干扰运行的外部Javascript,则这是所需的行为。

6

这听起来非常简单


<%- if params[:controller] == 'controller_name' and params[:action] == 'index' %>
  <body data-no-turbolink="true">
<%- else %>
  <body data-no-turbolink="false">
<%- end %>

我希望你能帮到你。

10
在Turbolinks5中,请改用<body data-turbolinks="false"> - ka2n

2
在最新的Turbolinks中,我必须同时添加两个add:
<meta name="turbolinks-visit-control" content="reload">

<head>标签中:
 <body data-turbolinks="false">

可以使用 <body> 标签的替代方法来完全禁用特定页面的 Turbolinks。

1

要为特定链接关闭turbolink

<a href="/" data-turbolinks="false"></a>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接