Я пытаюсь обобщить то, что вам нужно сделать.Если вы выполняете каждый раздел шаг за шагом, это не должно быть большой проблемой для реализации.
Сделайте раскрывающийся список невидимым.
Создание скрытого <select>
поля для передачи через POST (также из-за пользователей не-js)
Вы можете создать массив для стран
var countries = [
{ name: "Russian", flag: "flag_ru.gif" },
{ name: "USA", flag: "flag_en.gif" },
{ name: "Germany", flag: "flag_de.gif" },
{ name: "China", flag: "flag_ch.gif" }
];
keydown
прослушиватель событий для текста <input>
поле
// function keydown(e)
e = e || window.event;
switch (e.keyCode)
// 38: up
// 40: down
При каждом нажатии клавиш вверх / вниз выполните следующие действия:
3.1.Отслеживайте активный элемент (выбранный с помощью клавиш со стрелками), добавьте специальный класс, например active
.
3.2.Измените флаг рядом с полем <input>
.
3.3.Измените скрытое поле <select>
.
Дополнительно: Сделайте выбор Круглый .Если клавиша «вниз» нажата, когда активна последняя, перейдите к первой.То же самое относится к клавише «вверх» и первому элементу.
Extra2: Очистите вашу разметку и отделите от представления (CSS).
Extra3: Вы должны сделать всю форму доступной без мыши, чтобы клавиши со стрелками не только отображали выпадающий список, но и могли фактически перемещаться с ними.Чтобы закрыть выпадающий список, можно использовать кнопку esc
.Вот подтверждение концепции :
function handleArrowKeys(e) {
// capture the event
e = e || window.event;
// collect link elements
var dropdown = byId("dropdown");
var elements = byTag("tr", dropdown);
var len = elements.length - 1;
var i = selectedIndex;
// handle event
switch (e.keyCode) {
case 38: // up
if (i <= 0) { // overflow
selectedIndex = len;
removeClass(elements[i], "active");
addClass(elements[len], "active");
} else {
removeClass(elements[i], "active");
addClass(elements[i-1], "active");
selectedIndex -= 1;
}
// update <select>
break;
case 40: // down
if (i >= len) { // overflow
selectedIndex = 0;
removeClass(elements[i], "active");
addClass(elements[0], "active");
} else {
removeClass(elements[i], "active");
addClass(elements[i+1], "active");
selectedIndex += 1;
}
// update <select>
break;
case 27: // esc
hide("dropdown");
break;
default: return true;
}
return false;
}