Ответ 1
Существует простой программный способ сделать это с помощью Javascript... так что здесь грубый способ.
Элементы, которые могут получать фокус, должны быть перемещены пользовательскими агентами в соответствии со следующими правилами:
- Те элементы, которые поддерживают атрибут tabindex и назначают положительное значение для него осуществляется сначала. Навигация исходит от элемент с наименьшим значением tabindex для элемента с наивысшим значением стоимость. Значения не обязательно должны быть последовательными и не должны начинаться с каких-либо особое значение. Элементы, имеющие одинаковые значения tabindex, должны перемещаться в порядке их появления в потоке символов.
- Те элементы, которые не поддерживают атрибут tabindex или поддерживают его и присвойте ему значение "0". Эти элементы перемещаются в том порядке, в котором они появляются в потоке символов.
- Элементы которые отключены, не участвуют в порядке табуляции.
Я выполнил это, сохранив порядок элементов в форме, которая имеет tabIndex > 0
в своем порядке tabIndex, а затем конкатенирует остальные элементы в том порядке, в котором они появляются в документе. Следующий код имитирует нажатие клавиши Tab при фокусировке на ввод формы и нажимается буква "z" (но вы можете изменить это на любое условие, которое вам нужно):
$(':input').keypress(function(e){
// if 'z' pressed
if (e.which == 122) {
// if we haven't stored the tabbing order
if (!this.form.tabOrder) {
var els = this.form.elements,
ti = [],
rest = [];
// store all focusable form elements with tabIndex > 0
for (var i = 0, il = els.length; i < il; i++) {
if (els[i].tabIndex > 0 &&
!els[i].disabled &&
!els[i].hidden &&
!els[i].readOnly &&
els[i].type !== 'hidden') {
ti.push(els[i]);
}
}
// sort them by tabIndex order
ti.sort(function(a,b){ return a.tabIndex - b.tabIndex; });
// store the rest of the elements in order
for (i = 0, il = els.length; i < il; i++) {
if (els[i].tabIndex == 0 &&
!els[i].disabled &&
!els[i].hidden &&
!els[i].readOnly &&
els[i].type !== 'hidden') {
rest.push(els[i]);
}
}
// store the full tabbing order
this.form.tabOrder = ti.concat(rest);
}
// find the next element in the tabbing order and focus it
// if the last element of the form then blur
// (this can be changed to focus the next <form> if any)
for (var j = 0, jl = this.form.tabOrder.length; j < jl; j++) {
if (this === this.form.tabOrder[j]) {
if (j+1 < jl) {
$(this.form.tabOrder[j+1]).focus();
} else {
$(this).blur();
}
}
}
}
});