Это, по общему признанию, глупое решение, но здесь идет.
Некоторое объяснение того, что это пытается сделать. Я бы с удовольствием поправил здесь, поэтому, пожалуйста, стреляйте.
Получить все элементы класса "nav." Это элементы, на которые мы хотим переключить фокус.
Из этого набора найдите ранее сфокусированный элемент и его индекс. К сожалению, Internet Explorer и FireFox либо не предоставляют способа, либо различаются по способам определения того, какой элемент был сфокусирован. Я обманываю здесь с пользовательским атрибутом "isFocused".
Если не было ранее сфокусированного элемента, установите для самого первого элемента в наборе значение focus и добавьте в него атрибут isFocused.
Если был ранее сфокусированный элемент, удалите из него атрибут isFocused и найдите следующий элемент nav после него. Этот код поддерживает запуск с начала набора, поэтому, если вы сфокусируете последний элемент с помощью этой техники и нажмете Shift + "*", первый элемент будет сфокусирован.
Есть проблемы с этим подходом. Он узколобый и не учитывает элементы, сфокусированные вручную пользователем. Он также назначает обработчик щелчка элементу HTML, чтобы перехватывать все действия. Возможно, это не самый эффективный способ решения этой проблемы.
$(document).ready
(
function()
{
$("html").keydown
(
function(e)
{
if(e.shiftKey && e.keyCode == 42)
{
var wrappedElemSet = $(".nav");
var focusedElementIndex = -1;
var focusedElement;
var elems = wrappedElemSet
.each
(
function(i)
{
if($(this).attr("isFocused"))
{
focusedElementIndex = i;
focusedElement = $(this);
return false;
}
}
)
if(focusedElementIndex == -1)
{
$(wrappedElemSet[0])
.attr("isFocused", "isFocused")
.focus();
}
else
{
var elementIndexToFocus =
focusedElementIndex == wrappedElemSet.size() + 1 ?
0 : focusedElementIndex + 1;
focusedElement.removeAttr("isFocused");
$(wrappedElemSet[elementIndexToFocus])
.attr("isFocused", "isFocused")
.focus();
}
}
}
);
}
);