【问题标题】:How to disable Turbolinks in a specific page?如何在特定页面中禁用 Turbolinks?
【发布时间】:2014-11-28 19:41:59
【问题描述】:

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

我安装了 gem '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"

标签: javascript ruby-on-rails turbolinks


【解决方案1】:

你可以在你的布局中使用这个 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,by:

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

【讨论】:

  • 我用了你的第二种方法,效果很好。谢谢。
  • 如果您碰巧使用 CoffeeScript,只需将(常用)第一行 $ -&gt; 替换为 $(document).on 'turbolinks:load', -&gt;
  • 更性感的格式: true} %>
  • 这对 TL5 仍然有效吗?
  • 这并没有禁用它,那只是挂钩到加载事件?
【解决方案2】:

对于turbolinks 5,如果你使用上面提到的这个方法:

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

您需要将其更改为:

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

【讨论】:

  • 在 HAML 中它需要是 :'data-turbolinks' =&gt; 'false'
  • 这就是我有时讨厌stackoverflow的原因。过时/旧版本的答案有更多的赞成票,仍然标记为“最佳答案”。感谢 Thomas 对 turbolinks5 的澄清!
【解决方案3】:

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

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

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

body 标记数据属性方法并没有像我期望的那样对我起作用 - 我假设加载一个支持 turbolinks 的页面,然后单击一个链接转到您要禁用的页面turbolinks 将导致完整的标准页面加载。情况似乎并非如此,尤其是使用后退按钮或历史导航。

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

【讨论】:

    【解决方案4】:

    这听起来很简单

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

    我希望这会有所帮助。

    【讨论】:

    • 在 Turbolinks5 中,请改用&lt;body data-turbolinks="false"&gt;
    【解决方案5】:

    对于最后一个 Turbolinks,我必须同时添加:

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

    &lt;head&gt; 和:

     <body data-turbolinks="false">
    

    代替 &lt;body&gt; 标记以完全禁用特定页面的 Turbolinks。

    【讨论】:

      【解决方案6】:

      关闭特定链接的turbolink

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

      【讨论】:

        猜你喜欢
        • 2014-04-15
        • 2020-09-06
        • 1970-01-01
        • 2022-08-12
        • 2014-12-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        相关资源
        最近更新 更多