Я создал форму с плагином формы malsup, в которой он отправляет информацию об изменении входных данных.Я настроил свой сценарий jQuery для индексации выпадающих меню и видимых входов и использую этот индекс, чтобы определить, следует ли при нажатии клавиши табуляции переместить фокус на следующий или первый элемент, а также с помощью клавиш Shift + Tab.Однако вместо перемещения фокуса на первый элемент из последнего элемента на клавиатуре, как я бы этого хотел, он перемещает фокус на второй элемент.Как я могу изменить его, чтобы переключить фокус на фактические первый и последний элементы?Вот прямая ссылка на мою форму: http://www.presspound.org/calculator/ajax/sample.php. Спасибо всем, кто пытается помочь.Вот мой сценарий:
$(document).ready(function() {
var options = {
target: '#c_main',
success: setFocus
};
$('#calculator').live('submit', function() {
$(this).ajaxSubmit(options);
return false;
});
$(this).focusin(function(event) {
var shiftDown = false;
$('input, select').each(function (i) {
$(this).data('initial', $(this).val());
});
$('input, select').keyup(function(event) {
if (event.keyCode==16) {
shiftDown = false;
$('#shiftCatch').val(shiftDown);
}
});
$('input, select').keydown(function(event) {
if (event.keyCode==16) {
shiftDown = true;
$('#shiftCatch').val(shiftDown);
}
if (event.keyCode==13) {
$('#captured').val(event.target.id);
} else if (event.keyCode==9 && shiftDown==false) {
return $(event.target).each(function() {
var fields = $(this).parents('form:eq(0),calculator').find('select, input:visible');
var index = fields.index(this);
var nextEl = fields.eq(index+1).attr('id');
var firstEl = fields.eq(0).attr('id');
var focusEl = '#'+firstEl;
if (index>-1 && (index+1)<fields.length) {
$('#captured').val(nextEl);
} else if(index+1>=fields.length) {
if ($(this).val() != $(this).data('initial')) {
$('#captured').val(firstEl);
} else {
event.preventDefault();
$(focusEl).focus();
}
}
return false;
});
} else if (event.keyCode==9 && shiftDown==true) {
return $(event.target).each(function() {
var fields = $(this).parents('form:eq(0),calculator').find('select, input:visible');
var index = fields.index(this);
var prevEl = fields.eq(index-1).attr('id');
var lastEl = fields.eq(fields.length-1).attr('id');
var focusEl = '#'+lastEl;
if (index<fields.length && (index-1)>-1) {
$('#captured').val(prevEl);
} else if (index==0) {
if ($(this).val() != $(this).data('initial')) {
$('#captured').val(lastEl);
} else {
event.preventDefault();
$(focusEl).select();
}
}
return false;
});
}
});
});
});function setFocus () {with (document.calculator) var recap = document.getElementById (recaptured.value);if (recap! = null) {setTimeout (function () {if (recap.getAttribute ('type') == 'text') {recap.select ();} else {recap.focus ();}}, 100);}}
Edit # 1 : я внес несколько незначительных изменений в код, что немного приблизило меня к предполагаемой функциональности сценария.Однако я внес только одно изменение в код, относящийся к фокусу: я попытался отключить нажатие клавиши табуляции при нажатии на последнем элементе (а также нажатие клавиши shift + tab на первом элементе), пытаясь сосредоточиться наэлемент, который я хочу, не пропуская его, как это было раньше.Это код, который я добавил:
$(this).one('keydown', function (event) {
return !(event.keyCode==9 && shiftDown==true);
});
Этот вид работ.После загрузки страницы, если пользователь нажимает вкладку на последнем элементе, не внося изменений в его значение, фокус будет установлен на второй элемент.Однако во второй раз пользователь нажимает клавишу табуляции на последнем элементе, не внося изменений в его значение, и каждый последующий раз после этого фокус будет установлен на первый элемент, как мне бы хотелось.
Edit # 2 : я заменил код в Edit # 1 на код с использованием event.preventDefault (), который работает лучше.Если пользователь нажимает клавишу Shift + Tab в первом элементе, фокус переходит к последнему элементу, как и должно быть.Однако, если пользователь продолжает удерживать клавишу Shift и снова нажимает клавишу Tab, фокус будет возвращен к первому элементу.И если пользователь продолжает удерживать клавишу Shift все еще и нажимает на вкладку, фокус вернется к последнему элементу.Фокус будет смещаться вперед и назад между первым и последним элементом, пока пользователь не поднимет клавишу Shift.Эта проблема не возникает при нажатии только вкладки.Вот новый фрагмент кода:
event.preventDefault();
$(focusEl).focus();