Запретить автоматическую прокрутку браузера при обновлении



Если вы перейдете на страницу a и прокрутите ее, то обновите страницу в том месте, где вы ее оставили. Это здорово, однако это также происходит на страницах, где есть расположение якоря в url. Примером может быть, если вы нажали на ссылку http://example.com/post/244#comment5 и обновил страницу после просмотра вокруг вас не будет на якоре и страница прыгает вокруг. Есть ли способ предотвратить это с помощью javascript? Так что независимо от того, что вы всегда будете перемещаться к якорю.

518   7  

7 ответов:

Это решение больше не рекомендуется из-за изменений в поведении браузера. См. другие ответы.

в принципе, если используется якорь, мы привязываемся к событию прокрутки windows. Идея заключается в том, что первое событие прокрутки должно принадлежать автоматическому перемещению, выполняемому браузером. Когда это происходит, мы делаем свое собственное перемещение, а затем удаляем связанное событие. Это предотвращает последующие прокрутки страниц от бурения системы.

$(document).ready(function() {
    if (window.location.hash) { 
        //bind to scroll function
        $(document).scroll( function() {
            var hash = window.location.hash
            var hashName = hash.substring(1, hash.length);
            var element;

            //if element has this id then scroll to it
            if ($(hash).length != 0) {
                element = $(hash);
            }
            //catch cases of links that use anchor name
            else if ($('a[name="' + hashName + '"]').length != 0)
            {
                //just use the first one in case there are multiples
                element = $('a[name="' + hashName + '"]:first');
            }

            //if we have a target then go to it
            if (element != undefined) {
                window.scrollTo(0, element.position().top);
            }
            //unbind the scroll event
            $(document).unbind("scroll");
        });
    }

});

в Chrome, даже если вы заставите scrollTop до 0, он будет прыгать после первого события прокрутки.

вы должны привязать свиток к этому:

$(window).on('beforeunload', function() {
    $(window).scrollTop(0);
});

Итак, браузер обманут, чтобы поверить, что он был в начале до обновления.

чтобы отключить автоматическое восстановление прокрутки, просто добавьте этот тег в раздел head.

<script>history.scrollRestoration = "manual"</script>

он не поддерживается IE. совместимость с браузерами.

после ряда неудач, наконец, мне удалось сделать трюк. anzo правильно здесь, как с помощью beforeunload заставит страницу перейти к началу, когда пользователь перезагружает страницу или нажимает ссылку. Так что unload - это явно способ сделать это.

$(window).on('unload', function() {
   $(window).scrollTop(0);
});

Javascript путь (Спасибо ProfNandaa):

window.onunload = function(){ window.scrollTo(0,0); }

изменить: 16/07/2015

проблема перехода все еще существует с Firefox даже с unload событие.

вы можете просто поставить # в конце, так что страница будет загружаться в верхней части.

работает на всех браузерах, мобильных и настольных, ведь это так просто.

$(document).ready(function() {
var url = window.location.href;
console.log(url);
if( url.indexOf('#') < 0 ) {
    window.location.replace(url + "#");
} else {
    window.location.replace(url);
}

});

// это загружает страницу с # в конце.

вот более общий подход. Вместо того, чтобы пытаться предотвратить прокрутку браузера (или прыгать на вершину, как это будет выглядеть), я просто восстанавливаю предыдущую позицию на странице. Т. е. я записываю текущее y-смещение страницы в localStorage и прокручиваю до этой позиции после загрузки страницы.

function storePagePosition() {
  var page_y = window.pageYOffset;
  localStorage.setItem("page_y", page_y);
}


window.addEventListener("scroll", storePagePosition);


var currentPageY;

try {
  currentPageY = localStorage.getItem("page_y");

  if (currentPageY === undefined) {
    localStorage.setItem("page_y") = 0;
  }

  window.scrollTo( 0, currentPageY );
} catch (e) {
    // no localStorage available
}

вы должны быть в состоянии.

Onload, проверьте, если window.location.hash имеет значение. Если это так, возьмите элемент с идентификатором, который соответствует хэш-значению. Найдите положение элемента (рекурсивные вызовы offsetTop/offsetLeft) и затем передайте эти значения в window.scrollTo(x, y) метод.

этого нужно прокрутить страницу до нужного элемента.

Comments

    Ничего не найдено.