Maintain vertical scroll position

More...

This post describes how to maintain vertical scroll position after form submission or clicking on the link. Script will read vertical scroll position and append scroll value to the URL. After page is loaded, JavaScript function will search for the scroll parameter in the URL and set the scroll position.

Demo first. Please try to scroll few lines down and click on the my_scroll() link. Reloaded page should stay at the same vertical position. VoilĂ ! And the source:

// define functions
var set_scroll,
    my_scroll;

// if query string in URL contains scroll=nnn, then scroll position will be restored
set_scroll = function () {
    // get query string parameter with "?"
    var search = window.location.search,
        matches;
    // if query string exists
    if (search) {
        // find scroll parameter in query string
        matches = /scroll=(\d+)/.exec(search);
        // jump to the scroll position if scroll parameter exists
        if (matches) {
            window.scrollTo(0, matches[1]);
        }
    }
};

// function appends scroll parameter to the URL or returns scroll value
my_scroll = function (url) {
    var scroll, q;
    // Netscape compliant
    if (typeof(window.pageYOffset) === 'number') {
        scroll = window.pageYOffset;
    }
    // DOM compliant
    else if (document.body && document.body.scrollTop) {
        scroll = document.body.scrollTop;
    }
    // IE6 standards compliant mode
    else if (document.documentElement && document.documentElement.scrollTop) {
        scroll = document.documentElement.scrollTop;
    }
    // needed for IE6 (when vertical scroll bar is on the top)
    else {
        scroll = 0;
    }
    // if input parameter does not exist then return scroll value
    if (url === undefined) {
        return scroll;
    }
    // else append scroll parameter to the URL
    else {
        // set "?" or "&" before scroll parameter
        q = url.indexOf('?') === -1 ? '?' : '&';
        // refresh page with scroll position parameter
        window.location.href = url + q + 'scroll=' + scroll;
    }
};

// add onload event listener
if (window.addEventListener) {
    window.addEventListener('load', set_scroll, false);
}
else if (window.attachEvent) {
    window.attachEvent('onload', set_scroll);
}

The link my_scroll() shows how to call this page with some parameters and maintain scroll position. After clicking on the link, you will see example parameters followed by scroll position parameter. Please try to change scroll value directly in the address line and press enter. Page should take vertical position according to the changed value.

You can save this functions to the redips-scroll.js file and include it to the pages where maintaining vertical scroll position is important.

This entry was posted on November 16, 2009 and is filed under JavaScript

Related posts

18 Responses to Maintain vertical scroll position

  1. UKDraxion says:

    Can this be applied to the auto-refresh function of a web page, I am looking for something very similar to this, but it has to work with the auto refresh.

    Cheers

  2. dbunic says:

    set_scroll() function doesn't have to be modified. onload event will first set scroll position and set timer to call my_refresh() function (after 2 seconds in this example). my_refresh() is modified my_scroll() ...

    Hope this will help.
    Bye!

    // onLoad event
    window.onload = function() {
        set_scroll();
        setTimeout(my_refresh, 2000);
    }
    
    // set href location with scroll position
    function my_refresh(){
        var scroll, href, q;
        // Netscape compliant
        if (typeof(window.pageYOffset) == 'number') {
            scroll = window.pageYOffset;
        }
        // DOM compliant
        else if (document.body && document.body.scrollTop) {
            scroll = document.body.scrollTop;
        }
        // IE6 standards compliant mode
        else if (document.documentElement && document.documentElement.scrollTop) {
            scroll = document.documentElement.scrollTop;
        }
        // needed for IE6 (when vertical scroll bar is on the top)
        else {
            scroll = 0;
        }
        // define href
        href = window.location.href;
        // cut out scroll parameter with ? or & before
        href = href.replace(/.scroll=\d+/g, '')
        // test if href parameter contains ? character
        if (href.indexOf('?') === -1) q = '?';
        else q = '&';
        // refresh page with scroll position parameter
        window.location.href = href + q + 'scroll=' + scroll;
    }
    
  3. maher says:

    I cannot get it to work!!! What do I need to do exactly after including all this code, I guess I have to change something in my code but you don't mention anything about that. What do I have to pass as arguments to the function myHref??!!

  4. dbunic says:

    @maher - my_scroll() function expects parameters in form "?param1=a&param2=b&param3=c" to send to the page. scroll parameter will be added at the end and read in set_scroll() function. You also wrote myHref instead of my_scroll so the problem might be in calling non existing function.
    ;)

  5. craig says:

    On click of the game the page reload moves to the top. Can you suggest a way to maintain the vertical position of the game?
    http://www.exploreglencarbon.com/games/tictactoe.html
    Any assistance is greatly appreciated.

  6. craig says:

    I found the answer to my question on the following page
    http://scripterlative.com/files/recoverscroll.htm

    Works very well.
    Thanks.

  7. Very very useful.. Thank you so much

  8. Senthil Kumar says:

    this was helpful! thanks!

  9. Ben says:

    Sorry for the elementary question, I'm pretty new to javascript. Could you explain what calls the function my_refresh()? I see the function defined in the code, but there is no event that calls it.

  10. dbunic says:

    @Ben - my_refresh() was modification of original my_scroll() function to maintain vertical scroll position in auto-refresh mode. Inside window.onload you can see setTimeout() method which will call my_refresh() after 2 seconds. The setTimeout() method calls a function after a specified number of milliseconds.

  11. Don says:

    dbunic

    I have tried this with IE8 and can not get it to work. Have you looked at any update for this?

    Thanks.

  12. dbunic says:

    @Don - This script should work in IE8. I just open this page in IE8 and click on my_scroll() link. After page is loaded, scrollbar has been set to the exact location of previous scrollbar position. Do you have problem with this page or your own example?

  13. Alasdair says:

    Hey dbunic

    I am trying to add your function to a form that redirects to a page and then back to the original.

    When I add your function to the action value of the form, the form does not seam to post any of the fields within it. Do you know what I am doing wrong? (form code below)

  14. dbunic says:

    @Alasdair - Somehow your code is cut out from the comment. I guess that Askimet had his fingers on it (I will try to fix it later). Anyway, the trick is to send scroll parameter to the server with other needed parameters. Your script (PHP, ASPX ...) should accept scroll parameter and send it back to the page in URL. JavaScript code set_scroll() (hooked in onload event listener) will search for scroll parameter in query string. If scroll parameter is found, then new position of the vertical scroll bar will be set.

    The effect should be like click on this refresh link.

  15. Greg McMahan says:

    Hello to all coders of quality & others.

    I'm a bit confused... how do I get the scroll position to the scroll parameter. Here's what I'm doing: I'm including this code at the top of my form section:

    <input type="hidden" name="scroll" value="">
    

    How do I get the actual parameters into the value?
    Thanks!

  16. dbunic says:

    Greg McMahan - First, I renamed function to my_scroll() and it can be called without input parameter. If function is called without parameter then it will return current vertical scroll position. Here is example with button:

    and the HTML source:

    <input type="button" value="Click me" onclick="alert(my_scroll())"/>
    

    So, on the same way you can call this function and set scroll value to your form element before form submission. After page is refreshed, it's important that scroll parameter is in URL so set_scroll() can read scroll value and set vertical scroll position.

    PS - I have prepared several examples in redips11.tar.gz package so you can download it (download link is below post title) and see how script works.

  17. mmmmmmbbb says:

    oh very cool. for simply refreshing a page (with existing parameters) what worked most easily for me was 1) copy all the code from the top of this page (all the functions). 2) replace my_scroll function... with the my_refresh() function (posted 12.04.2010. at 18:10). then call it from a 'refresh' button:

    great. thanks.

  18. rrh says:

    Helped me a lot! Thank you!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

In case of posting HTML tags or JavaScript code please convert special characters to HTML entities.
Especially pay attention to convert "<" to "&lt;" character!