如何在特定页面中禁用Turbolinks?

时间:2014-11-28 19:41:59

标签: javascript ruby-on-rails turbolinks

我遇到一个问题,脚本只在刷新页面时起作用,所以我试图仅为该页面禁用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>

6 个答案:

答案 0 :(得分:22)

您可以在布局中使用此oneliner:

<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将优雅地回退到document load

答案 1 :(得分:9)

对于turbolinks 5,如果您使用上述方法:

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

您需要将其更改为:

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

答案 2 :(得分:5)

这听起来很简单

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

我希望这有帮助。

答案 3 :(得分:1)

我尝试了这里提到的其他方法无济于事,但是从Turbolinks 5文档中,您可以在不使用Turbolinks的情况下在您希望始终加载的页面上插入此元标记。

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

向所有链接添加数据属性意味着您必须知道所有这些链接的位置,如果您在用户创建的内容中可能存在内联链接,则这种链接很脆弱。

body标签数据属性方法对我来说不起作用,因为我期望它 - 我假设加载turbolinks支持的页面,然后单击链接转到要禁用的页面turbolinks将导致完整的标准页面加载。情况似乎并非如此,特别是使用后退按钮或历史导航。

添加此元标记会强制Turbolinks 5在尝试将任何内容插入dom之前执行整页重新加载。你得到了一个空白页面的经典闪光,但是如果像我一样,你使用的是需要在不受Turbolinks干扰的情况下发射的外部Javascript,那就是你想要的行为。

答案 4 :(得分:0)

对于最后的Turbolink,我必须添加两个地址:

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

<head>中:

 <body data-turbolinks="false">

代替<body>标记可完全禁用特定页面的Turbolinks。

答案 5 :(得分:0)

要关闭特定链接的Turbolink

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