Turbolinks empêche les événements normaux $(document).ready()
de se déclencher lors de toutes les visites de page autres que le chargement initial, comme indiqué précédemment ici et ici . Aucune des solutions dans les réponses liées ne fonctionne avec Rails 5, cependant. Comment puis-je exécuter du code sur chaque visite de page comme dans les versions précédentes?
Plutôt que d'écouter l'événement ready
, vous devez vous connecter à un événement déclenché par Turbolinks à chaque visite de page.
Malheureusement, Turbolinks 5 (la version qui apparaît dans Rails 5) a été réécrit et n'utilise pas les mêmes noms d'événement que dans les versions précédentes de Turbolinks, ce qui a entraîné l'échec des réponses mentionnées. Ce qui fonctionne maintenant, c’est d’écouter l’événement turbolinks: load comme suit:
$( document ).on('turbolinks:load', function() {
console.log("It works on each visit!")
})
JS natif:
document.addEventListener("turbolinks:load", function() {
console.log('It works on each visit!');
});
C'est ma solution, remplacer jQuery.fn.ready
, puis $(document).ready
fonctionne sans changement:
jQuery.fn.ready = (fn)->
$(this).on 'turbolinks:load', fn
Dans Rails 5, la solution la plus simple consiste à utiliser:
$(document).on('ready turbolinks:load', function() {});
Au lieu de $(document).ready
. Fonctionne comme un charme.
Voici une solution qui fonctionne pour moi, de ici :
installer gem 'jquery-turbolinks'
ajoutez ce fichier .coffee à votre application: https://github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee
nommez-le turbolinks-compatibility.coffee
à application.js
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require turbolinks-compatibility
Pendant que nous attendions la solution à ce petit bijou vraiment cool, j’ai pu aller de l’avant en modifiant ce qui suit:
addCallback: (callback) ->
if $.turbo.isReady
callback($)
$document.on 'turbo:ready', -> callback($)
à:
addCallback: (callback) ->
if $.turbo.isReady
callback($)
$document.on 'turbolinks:load', -> callback($)
Je ne sais pas encore ce que cela ne résout pas, mais cela semblait bien fonctionner lors de l'inspection initiale.
(Pour le café)
J'utilise: $(document).on 'turbolinks:load', ->
Au lieu de: $(document).on('turbolinks:load', function() {...})