scrollIntoView() 方法在输入时由 ENTER 键触发时停止滚动到元素的中途

scrollIntoView() method stops scrolling mid-way to the element when triggered by ENTER key on input

提问人:CeuxDruman 提问时间:10/27/2023 最后编辑:CeuxDruman 更新时间:10/27/2023 访问量:52

问:

上下文

我正在开发一个项目清单。

我在列表顶部有一个表单,用于添加新项目(只有 1 个输入和 1 个提交按钮)。

提交表单后,我有下一个代码,以便自动滚动到新元素(无论它适合列表的哪个位置):

document.getElementById(newItemId).scrollIntoView({ behavior: "smooth" });

为了测试目的和更好地理解问题,我创建了一个巨大的列表(50 个项目),并将所有新项目放在列表的底部,这样我就可以获得更清晰的证据。

web page with a form at the top and a list of items below

问题

创建项目 #51 时:

  • 如果我单击提交按钮(只需单击鼠标),它适用于所有浏览器(在 Chrome、Firefox 和 Edge 中测试):该项目在底部创建,浏览器向下滚动到页面末尾。web page scrolled at the bottom of the list

  • 如果我在输入聚焦时按 ENTER 键

    • 不适用于 Chrome:无论整个页面高度如何,它都会像窗口中间一样停止滚动。

    web page scrolled just like mid-window

    • 它在 Edge 上不起作用:它会在新项目之前停止一点。

    web page scrolled almost at the bottom of the list

    • 它可以在Firefox上正常工作

    web page scrolled at the bottom of the list

  • 如果我按 Tab 键进入提交按钮,然后按 ENTER 键它适用于所有浏览器。

注意:没有行为:“平滑”没有问题,因为它是一个即时滚动,中间没有时间被打断。

注2:我设法通过使用window.scrollTo()方法开发了一种解决方法,但我想让它与scrollIntoView()一起使用,以避免像素完美的计算,并将此问题报告给受影响的浏览器,以防这是一个错误。

代码示例

正如评论所建议的那样,我制作了这个 jsbin 用于测试目的:https://jsbin.com/kiwiviboro/edit?html,output

考虑:

  • 我做了一个简化版本,因为我的应用程序是在 TS / React / Next 中编程的。但行为是完全一样的。
  • 为了简化起见,表单实际上并没有创建一个新元素,只是滚动到最后一个元素(第 50 个)。
  • 在这个简化版本中,您可以检查滚动甚至不会在 Chrome 或 Edge 上移动单个像素,因为中间没有交互/请求。
  • 我在找到解决方案后做了这个,这就是为什么它包含更多逻辑。请查看我的解决方案,了解有关受影响逻辑的详细信息。
  • 如果我已经找到了解决方案,为什么还要这样做?因为我想讨论这是否真的是正确的行为,或者某些浏览器是否有应该报告和修复的错误。请检查我的解决方案以找到带有固定代码的 jsbin 以得出您自己的结论
JavaScript 滚动 焦点 输入

评论

1赞 Mehmet Baker 10/27/2023
你能发布一个jsbin等链接吗?

答:

0赞 CeuxDruman 10/27/2023 #1

问题的根源

我刚刚醒来时有了新的想法!并发现问题出在逻辑的其他部分。

我有一个逻辑可以在正确提交表单时隐藏表单(受影响的 CSS 属性:),所以这里的问题是输入“意外”失去焦点,并且某些浏览器 (Chrome) 在失去焦点时会停止任何滚动操作(也许还有其他类型的动画?),其他一些 (Edge) 会在一段时间后注意到它,而另一些 (Firefox) 甚至不在乎。visibility: hidden

我省略了它,因为由于浏览器行为之间的差异,它与这个问题无关。

溶液

如果您遇到此问题,只需在发送/隐藏表单之前输入,或者最准确地说/在任何其他情况下,在开始滚动操作之前输入,以便在滚动开始发生之前手动/故意失去焦点。.blur()

代码示例

我制作了与该问题相同的代码示例,但已经应用了修复程序:

https://jsbin.com/deciyenivo/edit?html,output

您可以检查它现在是否在所有浏览器中都能正常工作。

讨论

无论如何,您认为它仍然是 Chrome 和 Edge 的错误吗?(也许还有其他浏览器)我应该举报吗?

或者这被认为是正确的行为?

为了记录,我将把我当前的浏览器版本留在这里:

  • Chrome: 118.0.5993.89 (Build oficial) (64 bits)
  • Firefox:113.0.2(64 位)
  • Edge: 118.0.2088.61 (Compilación oficial) (64 位)