const next = row.nextElementSibling || row.previousElementSibling
;(next ? next.querySelector('a,button') : emptyTip).focus()
row.remove()

在后台列表里按回车删掉第三行,行没了,焦点也一起消失,再按 Tab 从浏览器地址栏重新开始,用户要按十几次才能回到原来的位置。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,删除时把整行节点直接从文档里移除,而焦点正停在这一行上。浏览器找不到承接焦点的元素,只能把焦点退回 body,位置信息就丢了。

「删除后焦点」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

处理上按这个顺序:删除前先确定下一个落点,优先取下一行,没有下一行就取上一行;先移动焦点再移除节点,顺序反了焦点就已经丢了;列表空了就把焦点放到空状态提示上,别让它落到页面顶部。

改完只确认一件事:连删三行,每次焦点都停在新的一行操作按钮上,Tab 不会跳回地址栏。

作者 9823189