Comment désactiver les Turbolinks dans une page spécifique?
j'ai un problème avec un script qui ne fonctionne qu'en rafraîchissant la page et donc j'essaye de désactiver les Turbolinks pour cette page seulement. Le code ci-dessous ne fonctionne pas. Cependant, si j'ajoute l'attribut" data-no-turbolink " directement à la balise body en application.HTML.erb il fonctionne. Comment puis-je désactiver les Turbolinks à mon avis? J'ai suivi la solution posté ici Rails 4: désactiver les Turbolinks sur une page spécifique mais je n'arrive pas à le faire fonctionner.
j'ai la pierre précieuse "jQuery-turbolinks" installé.
politique.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>
4 réponses
vous pouvez utiliser cet oneliner dans votre mise en page:
<body <%= "data-no-turbolinks='true'".html_safe if controller_name=="pages" && action_name=="policy" %>>
Mais la autre façon de faire, que j'utilise principalement, serait de mettre ce bout de code pour les liens menant à cette page...
Donc, supposons que votre itinéraire est nommé :policy
, vous devez faire ceci:
<%= link_to "Policy", policy_path, :"data-no-turbolink" => true %>
Long temps a passé, voici une mise à jour
Récemment, j'ai commencé à utiliser turbolinks 5.0 beta
par:
gem 'turbolinks', '~> 5.0.0.beta'
cela devient beaucoup plus facile... Tout document ready
javascript se charge, pas de problème... Tout ce que vous avez à faire est d'ajouter un écouteur pour l'événement load.
$(document).on('turbolinks:load', named_function );
var named_function = function() {
// thinks to do on document load
}
Vous n'avez pas à également ajouter
$(document).ready(function (){
// stuff
});
ou
$(document).ready(named_function);
Parce que Turbolinks
normalement revenir à document load
si la page est difficile chargé.
Pour turbolinks 5 si vous utilisez cette méthode mentionnée ci-dessus:
<%= link_to "Policy", policy_path, :"data-no-turbolink" => true %>
Vous aurez besoin de le modifier:
<%= link_to "Policy", policy_path, :"data-turbolinks" => false %>
cela va sembler vraiment simple
<%- if params[:controller] == 'controller_name' and params[:action] == 'index' %>
<body data-no-turbolink="true">
<%- else %>
<body data-no-turbolink="false">
<%- end %>
j'espère que cela aide.
j'ai essayé les autres méthodes mentionnées ici en vain, mais à partir des Turbolinks 5 docs, vous pouvez insérer cette balise meta sur la page que vous voulez toujours charger sans Turbolinks.
<meta name="turbolinks-visit-control" content="reload">
Ajouter un attribut de données à tous les liens signifie que vous devez savoir où sont tous ces liens, ce qui est fragile Si vous avez une situation où il pourrait y avoir des liens en ligne dans le contenu créé par l'utilisateur.
la méthode de l'attribut de données d'étiquette de corps n'a pas fonctionné pour moi comme je m'y attendais - J'aurais supposé que charger une page supportée par turbolinks et ensuite cliquer sur un lien pour aller à une page où vous voulez désactiver turbolinks résulterait en une pleine, charge de page standard. Cela ne semblait pas être le cas, surtout avec le bouton arrière ou la navigation historique.
L'ajout de cette balise meta force Turbolinks 5 à recharger une page entière avant de tenter d'insérer du contenu dans le dom. Vous obtenez ce flash classique d'une page blanche, mais si comme moi, vous utilisez Javascript externe il faut que ça se déclenche sans interférence des Turbolinages, c'est le comportement désiré.