事实证明,由于事件以错误的顺序发生,因此您无法平滑滚动以进行焦点更改。在设置焦点之前,当它将字段滚动到视图中时,您会遇到可怕的延迟。我们只能希望屏幕上的项目更好地移动,或者超快滚动。
正如 PlantTheIdea (+1'ed) 所建议的,您需要抓住 TAB 键并找到下一个可聚焦的项目,将其置于视图中,然后将焦点设置为它。
在实践中,有许多问题需要解决:
- 焦点的改变发生在 TAB keydown(不是 keyup)上。
- 只匹配非隐藏的输入(很多网络应用程序都有隐藏的字段,如果你试图集中它们就会爆炸)。
- 允许选择标签关闭页面上的第一个或最后一个项目(否则浏览器将失去标签到其地址栏的能力)
- 用于
e.keyCode || e.which
允许较旧的浏览器
- 在文档级别捕获事件以允许滚动区域之外的其他输入的情况,使其进入滚动区域(第一个或最后一个输入)。
最终代码如下所示:
$(document).on('keydown', ':focus', function (event)
{
if ((event.keyCode || event.which) == 9)
{
var $inputs = $(":input:not(hidden)")
var index = $inputs.index(this);
// Index previous or next input based on the shift key
index += event.shiftKey ? -1 : 1;
// If we are in the range of valid inputs (else browser takes focus)
if (index >= 0 && index < $inputs.length)
{
var $next = $inputs.eq(index);
event.preventDefault();
// Move, not scroll, to the next/prev item....
MoveIntoView($next);
$next.focus();
return false;
}
}
});