фокус () для ввода без прокрутки - PullRequest
41 голосов
/ 11 февраля 2011

У меня есть поисковый ввод текста, который я хотел бы применить focus() при загрузке страницы, проблема в том, что функция focus автоматически выполняет прокрутку к этому полю.Любое решение, чтобы отключить этот свиток?

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

Ответы [ 6 ]

46 голосов
/ 07 июля 2011

Вот полное решение:

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

cursorFocus(document.getElementById('search-terms'));
31 голосов
/ 29 января 2018

Существует новый WHATWG стандарт , который позволяет вам передавать объект в focus(), который указывает, что вы хотите запретить браузеру прокручивать элемент в представление:

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

element.focus({
  preventScroll: true
});

Поддерживается начиная с Chrome 64 и Edge Insider Preview build 17046 , и должен быть установлен в Firefox 68 - матрица поддержки доступна на web-платформа-тесты здесь .

6 голосов
/ 07 мая 2013

Немного измененная версия, которая поддерживает больше браузеров (включая 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 голосов
/ 26 июля 2012

Если вы используете jQuery, вы также можете сделать это:

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

, а затем

$('#search_terms').focusWithoutScrolling();
5 голосов
/ 29 января 2017

Ответы здесь не касаются прокрутки по всей иерархии, а только основных полос прокрутки. Этот ответ позаботится обо всем:

    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];
        });
    };
0 голосов
/ 25 июля 2015

На сегодняшний день предпочтительным способом установки фокуса на элементе при загрузке страницы является использование атрибута autofocus.Это не требует прокрутки.

<input id="search_terms" type="text" autofocus />

Атрибут autofocus является частью стандарта HTML5 и поддерживается всеми основными браузерами, за исключением заметного Internet Explorer 9ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...