Search code examples
turbolinks

How to persist scrolls with turbolinks?


Sometimes it is desirable to persist scroll positions between page visits.

Turbolinks resets scroll position after loading the data.

How can I disable it for particular elements?


Solution

  • Use the following javascript to persist scrolls. I have created a selector that matches all elements with class turbolinks-disable-scroll. Before loading,the script saves the scroll position and after loading it loads the saved positions.

    // persist scrolls
    // pirated from https://github.com/turbolinks/turbolinks-classic/issues/205
    var elementsWithPersistentScrolls, persistentScrollsPositions;
    
    elementsWithPersistentScrolls = ['.turbolinks-disable-scroll'];
    
    persistentScrollsPositions = {};
    
    $(document).on('turbolinks:before-visit', function() {
        var i, len, results, selector;
        persistentScrollsPositions = {};
        results = [];
        for (i = 0, len = elementsWithPersistentScrolls.length; i < len; i++) {
            selector = elementsWithPersistentScrolls[i];
            results.push(persistentScrollsPositions[selector] = $(selector).scrollTop());
        }
        return results;
    });
    
    $(document).on('turbolinks:load', function() {
        var results, scrollTop, selector;
        results = [];
        for (selector in persistentScrollsPositions) {
            scrollTop = persistentScrollsPositions[selector];
            results.push($(selector).scrollTop(scrollTop));
        }
        return results;
    });