修改表格TD的colspan后如何让TAB键焦点跳转至相邻下一个输入框
我希望无需提前知晓下一个元素是什么,就能通过TAB键将焦点移动到下一个输入元素。
背景
我有一个表格,可用屏幕空间非常有限。表格中有一列的文本字段可能容纳的内容超出列宽,为了让用户输入文本时无需在输入框内滚动就能查看全部内容,我需要在输入框获得焦点时放大/加宽输入框,失去焦点时恢复原尺寸。
但我不希望直接放大输入框所在的列,否则这类输入框获得/失去焦点时会触发整个表格持续重绘,对用户来说观感很差,也容易造成困惑。
当前实现方案
当需要放大的输入元素触发onfocus事件时,我将该元素所在TD的colspan属性设置为X(X为该TD需要跨的列数),同时将同一TR中、该聚焦输入框所在TD右侧的X-1个TD设置为display: none。
当触发onblur事件时,我会还原所有修改:失去焦点的输入框所在TD的colspan恢复为1,其右侧的X-1个TD重新设置为display: table-cell。
遇到的问题
上述方案的重绘表现符合预期,只有轻微的“跳动”现象,但焦点不会移动到刚失去焦点的输入框相邻的、重新显示的下一个输入元素,而是会跳转到第一个未被隐藏的TD对应的输入框。
示例说明
假设存在一个5列3行的表格,每个TD都包含一个输入框。列编号为A到E,行编号为1到3,所有列宽度均为20%。仅当列A中某个TD的输入框获得焦点时,才放大该TD。
当A2获得焦点时,设置colspan=3,同时B2和C2设置为display: none。一旦A2的输入框触发onblur事件,所有修改还原:A2的colspan恢复为1,B2和C2恢复为display: table-cell。此时焦点落在D2上,这就是我遇到的问题。
已尝试的思路
- 我知道可以维护一个存储所有输入元素引用的矩阵,再对应调用
setFocus设置焦点,但这种方案需要大量关联逻辑,我非常不希望采用,而且大概率稳定性很差。 - 最简单的方案是能够“重新计算”已经携带了下一个焦点目标的blur事件,显然当前计算焦点目标时没有把重新显示的隐藏元素纳入计算。
- 另一种可选方案是可以直接执行类似“将焦点回移2个元素”的命令。
- 第三种方案是将获得焦点的输入框从表格/TD中抽离,悬浮在表格上方,但还没找到对应的CSS实现方法。
内容的提问来源于stack exchange,提问作者robkuz

