this.attachShadow({mode:'open', delegatesFocus:true})
<my-search tabindex='0'></my-search>
把搜索框封装成自定义元素后,外层的 Tab 能到组件,再按一次却直接跳到下面的按钮,里面的输入框像不存在一样。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,shadow root 默认不参与外层焦点序列,内部元素没有暴露给宿主。宿主元素本身又不可聚焦,焦点经过时就被整体跳过。
「shadow DOM 焦点」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:在 attachShadow 时传入 delegatesFocus 为真,把焦点委托给内部第一个可聚焦元素;宿主元素补上 tabindex,保证它在序列里有位置;焦点进入后给宿主加一圈可见描边,别让用户以为什么都没发生。
改完只确认一件事:从上一个控件按 Tab,焦点直接落进组件内部的输入框,再按一次正常离开。
