【问题标题】:JS scrollIntoView not working with focus()JS scrollIntoView 不使用焦点()
【发布时间】:2020-11-25 07:12:27
【问题描述】:

在一个函数中,我试图实现两件事:

  1. 滚动到某个部分
  2. 专注于输入

这是我的代码:

function search() {
  document.getElementById("searchbar").style.display = "block";
  document.getElementById("flex").style.display = "none";
  document.getElementById("books").scrollIntoView({behavior: 'smooth'});
  key();
};
function key(){
  document.getElementById("searchbox").focus();
};

滚动在这里不起作用。如果我删除“键”功能,它可以工作。

不需要单独的“键”功能,但我试过了。

id 为“searchbox”的输入被放置在“position:fixed”分区内。它在“书籍”部分之外。

【问题讨论】:

    标签: javascript html jquery css function


    【解决方案1】:

    您可以简单地颠倒调用这些方法的顺序。

    function search() {
      document.getElementById("searchbox").focus(); 
      document.getElementById("books").scrollIntoView({behavior: 'smooth'});
    };
    document.getElementById("btn").onclick = search;
    #books {
      margin-top: 300vh;
    }
    <button id="btn">search</button>
    <input id="searchbox" value="#searchbox">
    <div id="books">Some books</div>

    调用Element.focus() 会自动使您的浏览器滚动到该元素。这样做,它将取消之前对scrollIntoView 的调用。通过颠倒调用顺序,scrollIntoView 将取消 focus' 滚动,这正是你想要的。

    【讨论】:

    • 嘿!这在桌面上运行良好,但不适用于 Android 的 chrome - 这是我的主要目标。
    • 啊,我想那会有延迟(可能与虚拟键盘的外观有关?)我现在没有太多时间看它,但也许像document.addEventListener('scroll', e=&gt;.scrollIntoView(), { once;true} ) 这样的东西会做,或者一个丑陋的 setTimeout ......当我有时间时,我会试着看看这个。
    • 在这上面花了几分钟,我没有找到一个足够好的手机解决方案...有一个{ preventScroll: true } 选项我们可以传递给 HTMLElement.focus,但是滚动在移动浏览器中发生的情况并非由此 focus 调用直接引起。这是显示虚拟键盘的一部分,我们没有办法阻止这种情况。 github.com/whatwg/html/issues/4608 因为这样的动作甚至会导致缩放,所以我们真的无能为力。但是,也许你的情况允许你不坚持那个输入,而是让它position:fixed -> 不需要滚动。
    • 感谢您抽出宝贵时间对此进行调查。您的回答有助于在桌面上解决新问题。
    • 其实输入是一个搜索框,滚动会弹出一个表格,可以使用seachbox进行过滤。同时,我正在尝试 1)显示固定在顶部的隐藏“输入”,2)将页面滚动到“表格”部分 3)专注于输入,以便在手机上弹出软键盘
    猜你喜欢
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多