2016-03-20 15 views
43

Turbolinks verhindert normale $(document).ready() Ereignisse abfeuern bei allen Seitenbesuchen neben der anfänglichen Belastung, wie diskutiert here und here. Keine der Lösungen in den verknüpften Antworten funktioniert jedoch mit Rails 5. Wie kann ich Code bei jedem Seitenaufruf wie in früheren Versionen ausführen?

Antwort

96

Anstatt auf das Ereignis ready zu hören, müssen Sie sich bei jedem Besuch einer Seite an einem Ereignis beteiligen, das von Turbolinks ausgelöst wird.

Leider wurde Turbolinks 5 (die Version, die in Rails 5 angezeigt wird) neu geschrieben und verwendet nicht die gleichen Ereignisnamen wie in früheren Versionen von Turbolinks, wodurch die angegebenen Antworten fehlschlagen. Was ist funktioniert nun das turbolinks:load Ereignis zu hören, wie so:

$(document).on('turbolinks:load', function() { 
    console.log("It works on each visit!") 
}) 
+3

Ja. Auch hier erklärt. http://guides.rubyonrails.org/working_with_javascript_in_rails.html#turbolinks. Überprüfen Sie 5.2 Seite Ereignisse ändern. –

+3

Turbolinks: Laden Brände für mich vor Ort, aber nicht auf Heroku. Ich sehe meinen benutzerdefinierten JavaScript-Code in meinen kompilierten JS-Assets, aber das Ereignis wird nicht ausgelöst. – psparrow

+0

das funktioniert nicht gut. Ich habe eine select2 und wenn ich die Seite ändere und zurück habe ich zwei select2 (dupliziert) – inye

-1

Mit dem leichtgewichtigen gem jquery-turbolinks.

Es macht $(document).ready() arbeiten mit Turbolinks ohne bestehenden Code zu ändern.

Alternativ können Sie $(document).ready() einem der ändern:

$(document).on('page:fetch', function() { /* your code here */ }); 

$(document).on('page:change', function() { /* your code here */ }); 

je nachdem, welche besser geeignet in Ihrer Situation ist.

+0

jquery-turbolinks unterstützt noch nicht Turbolinks 5 https://github.com/kossnocorp/jquery.turbolinks/issues/56 – AndrewH

+0

Sie haben recht, @AndrewH! Hoffentlich wird der Support bald hinzugefügt. – Vadim

+0

Das Juwel von jquery-turbolinks ist veraltet. –

0

Während wir auf die Reparatur dieses wirklich coolen Edelsteins warten, war ich in der Lage, weiter voranzukommen, indem ich Folgendes änderte:

addCallback: (callback) -> 
if $.turbo.isReady 
    callback($) 
$document.on 'turbo:ready', -> callback($) 

zu:

addCallback: (callback) -> 
if $.turbo.isReady 
    callback($) 
$document.on 'turbolinks:load', -> callback($) 

bin ich noch nicht bewusst, was diese nicht lösen, aber es schien gut auf Erstprüfung zu arbeiten.

2

Hier Lösung, die für mich arbeiten, von here:

  1. installieren gem 'jquery-turbolinks'

  2. diese .coffee Datei zu Ihrer App hinzufügen: https://github.com/turbolinks/turbolinks/blob/master/src/turbolinks/compatibility.coffee

  3. Name es turbolinks-Kompatibilität. Kaffee

  4. bei Anwendung.js

    //= require jquery 
    //= require jquery_ujs 
    //= require jquery.turbolinks 
    //= require turbolinks 
    //= require turbolinks-compatibility 
    
+0

Wie wäre es mit 'production' env ? Hast du es ausprobiert? Es gibt einige Leute, die sagen, dass es einfach nur im Entwicklungsmodus funktioniert. –

+0

Für mich funktioniert es in der Produktion – ChaosPredictor

+2

Das Juwel ist veraltet – Mauro

8

Einheimische JS:

document.addEventListener("turbolinks:load", function() { 
    console.log('It works on each visit!'); 
}); 
2

Diese meine Lösung ist, außer Kraft setzen jQuery.fn.ready, dann $(document).ready Arbeiten ohne Änderung:

jQuery.fn.ready = (fn)-> 
    $(this).on 'turbolinks:load', fn 
+0

Das ist genau das, was ich brauchte. Dies funktioniert für externe Bibliotheken, die ebenfalls auf "Dokument" -Rückrufe angewiesen sind. Warum der Downvote? Dies sollte sicher sein, solange Turbolinks in der gesamten Anwendung verwendet werden, oder? –

-2

Verwendung:

Anstelle von: $(document).on('turbolinks:load', function() {...})

+0

Ich habe das getan und ich bekomme immer noch dieses Problem, als @inye sagte: https://github.com/mkhairi/materialize-sass/issues/130. Die Verwendung von JS oder Kaffee macht keinen Unterschied, zumindest NICHT für mich. –

Verwandte Themen