web-dev-qa-db-ja.com

focus()スクロールせずに入力する

ページをロードするときにfocus()を適用したい検索入力テキストがあります。問題はfocus関数がこのフィールドに自動的にスクロールすることです。このスクロールを無効にする解決策はありますか?

<input id="search_terms" type="text" />
<script>
    document.getelementbyId('search-terms').focus();
</script>
42
NoOneElse

完全なソリューションは次のとおりです。

var cursorFocus = function(elem) {
  var x = window.scrollX, y = window.scrollY;
  elem.focus();
  window.scrollTo(x, y);
}

cursorFocus(document.getElementById('search-terms'));
46
peterjwest

新しい WHATWG標準 があります。これにより、オブジェクトをfocus()に渡すことができます。これは、ブラウザーが要素をスクロールして表示できないようにすることを指定します。

const element = document.getElementById('search-terms')

element.focus({
  preventScroll: true
});

Chrome 64 および Edge Insider Previewビルド17046 以降にサポートされており、 Firefox 68 でサポートされるはずです-サポートマトリックスは次で利用可能です- web-platform-tests here

38
Josh

JQueryを使用している場合、これも実行できます。

$.fn.focusWithoutScrolling = function(){
  var x = window.scrollX, y = window.scrollY;
  this.focus();
  window.scrollTo(x, y);
};

その後

$('#search_terms').focusWithoutScrolling();
6
Felipe Martim

より多くのブラウザをサポートする少し変更されたバージョン(IE9を含む)

var cursorFocus = function(elem) {
  var x, y;
  // More sources for scroll x, y offset.
  if (typeof(window.pageXOffset) !== 'undefined') {
      x = window.pageXOffset;
      y = window.pageYOffset;
  } else if (typeof(window.scrollX) !== 'undefined') {
      x = window.scrollX;
      y = window.scrollY;
  } else if (document.documentElement && typeof(document.documentElement.scrollLeft) !== 'undefined') {
      x = document.documentElement.scrollLeft;
      y = document.documentElement.scrollTop;
  } else {
      x = document.body.scrollLeft;
      y = document.body.scrollTop;
  }

  elem.focus();

  if (typeof x !== 'undefined') {
      // In some cases IE9 does not seem to catch instant scrollTo request.
      setTimeout(function() { window.scrollTo(x, y); }, 100);
  }
}
6
MDJ

ここでの答えは、階層全体のスクロールを考慮せず、メインのスクロールバーのみを扱います。この答えはすべてを処理します:

    var focusWithoutScrolling = function (el) {
        var scrollHierarchy = [];

        var parent = el.parentNode;
        while (parent) {
            scrollHierarchy.Push([parent, parent.scrollLeft, parent.scrollTop]);
            parent = parent.parentNode;
        }

        el.focus();

        scrollHierarchy.forEach(function (item) {
            var el = item[0];

            // Check first to avoid triggering unnecessary `scroll` events

            if (el.scrollLeft != item[1])
                el.scrollLeft = item[1];

            if (el.scrollTop != item[2])
                el.scrollTop = item[2];
        });
    };
5
daniel.gindi