focus()输入而不滚动

NoO*_*lse 44 html javascript scroll

我有一个搜索输入文本,我想focus()在加载页面时应用一个,问题是该focus函数自动滚动到这个字段.任何禁用此滚动的解决方案?

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

pet*_*est 46

这是一个完整的解决方案:

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

cursorFocus(document.getElementById('search-terms'));
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,但在IE9的某些情况下,最好使用`setTimeout(function(){window.scrollTo(x,y);},100);`而不是`window.scrollTo(x,y);`. (5认同)
  • 当我这样做时,我仍然可以看到页面滚动到顶部,然后跳回到保存的位置.有办法防止这种情况吗? (3认同)

Jos*_*osh 41

有一个新的WHATWG标准,它允许您传递一个对象focus(),指定您希望阻止浏览器将元素滚动到视图中:

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

element.focus({
  preventScroll: true
});
Run Code Online (Sandbox Code Playgroud)

Chrome 64Edge Insider Preview build 17046目前支持它.

  • @Sunny相关的Mozilla错误已在此处提交:https://bugzilla.mozilla.org/show_bug.cgi?id=1374045&https://bugzilla.mozilla.org/show_bug.cgi?id=1410112 (2认同)

Fel*_*tim 7

如果您使用的是jQuery,您也可以这样做:

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

然后

$('#search_terms').focusWithoutScrolling();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,但我发现需要将你的函数的第一行改为`var x = $(document).scrollLeft(),y = $(document).scrollTop();`以便让它在IE10. (3认同)

MDJ*_*MDJ 6

一个支持更多浏览器的修改版本(包括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);
  }
}
Run Code Online (Sandbox Code Playgroud)


dan*_*ndi 5

这里的答案不是在整个层次结构上滚动,而是仅在主滚动条上滚动.这个答案将照顾一切:

    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];
        });
    };
Run Code Online (Sandbox Code Playgroud)