web-dev-qa-db-ja.com

ページの更新後にブラウザの自動スクロールを無効にしますか?

一部の最新のブラウザ(ChromeおよびSafari)がページ更新時のスクロール位置を記憶する動作を無効にする方法はありますか?

14
Anthony

History.scrollRestorationをサポートするブラウザーの場合、自動スクロール動作をオフにすることができます。

if ('scrollRestoration' in history) {
  history.scrollRestoration = 'manual';
}

ソース: https://developers.google.com/web/updates/2015/09/history-api-scroll-restoration

26
Cory Duncan

ドキュメントの準備ができた後にこれを起動してみましたか?

$(document).ready(function(){
    window.scrollTo(0, 0);
});

それがうまくいかない場合...

$(document).ready(function(){
    setTimeout(function(){
        window.scrollTo(0, 0);
    }, 1);
});

これはこれをコールスタックの一番下にプッシュします

3
Robert

クロムだけでなく、すべての人にとって、これはうまくいくと思います。

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

質問の更新後:

いくつかのCookieまたはセッションストレージを使用する方が良いと思います。

2
HIRA THAKUR

SetTimoutがスタックの一番下に来ることを期待する代わりに、私はむしろ、必要なスクロール位置に到達するように強制します。私はまだこれをハックだと思っています。私たちがバインドするある種のブラウザイベントを望んでいました。

var scrollToYPos = 100;
var interval = setInterval(checkPos, 0);

function checkPos() {
    if ($(window).scrollTop() == scrollToYPos) {
        clearInterval(interval);
    } else {
        window.scrollTo( 0, scrollToYPos );
        checkPos();               
    }
}      
0
Anthony

私はこれと同じ問題に遭遇しました。これが私が思いついた基本的な解決策です:

      // scroll the user to the comments section if we need to
      wt = win.scrollTop();
      wb = wt + win.height();
      // if scroll position is 0, do this (it's a fresh user), otherwise
      // the browser is likely to resume the user's scroll position, in 
      // which case we don't want to do this
      yab.loaded().done(function() {
        // it seems that browsers (consistently) set the scroll position after
        // page load.  Accordingly wait a 1/4 second (I haven't tested this to the lowest
        // possible timeout) before triggering our logic
        setTimeout(function() {
          // if the window top is 0, scroll the user, otherwise the browser restored
          // the users scroll position (I realize this fails if the users scroll position was 0)
          if(wt === 0) {
            p = self.container.offset().top;
            if(wb != p) {
              win.scrollTop(p - th - 20);         
            }
          }              
        }, 250);
      });
0
Skone