Я вижу несколько вещей, которые могут быть проблемой.Прежде всего, вы обновляете itemsContainer.children[i].nextSibling
, то есть itemsContainer.children[i+1]
.Вот почему всегда последний элемент, который он выбрал, если вы пропустите разрыв.itemsComtainer [i + 1] всегда будет зависать, если есть элемент, соответствующий классу.
Вторая проблема - это то, на что указывает Travesty3 в своем ответе.
Я также изменил условие if напроверьте, находится ли класс hovered на одном из дочерних элементов, а не на самом контейнере.
if (itemsContainer.children[i].getAttribute('class').match('hovered'))
Я изменил обработчик событий с помощью следующих строк кода, и это, кажется, работает нормально:
document.addEventListener('keyup',function(event){
if (event.keyCode === 40 && itemsContainer.style.display==='block') {
event.preventDefault();
for (var i=0,l=itemsContainer.children.length;i<l;++i){
if (itemsContainer.children[i].getAttribute('class').match('hovered')){
itemsContainer.children[i].setAttribute('class','');
itemsContainer.children[i+1].setAttribute('class','hovered');
break;
}
}
}
});
Имейте в виду, что создание такого выпадающего элемента управления - большая работа.Пользователь ожидает навигации по нему с помощью клавиатуры.Чтобы обеспечить удобство работы с пользователем, вам необходимо использовать несколько клавиш, например клавиши со стрелками, вкладку для фокусировки элемента управления, пробел для его открытия и закрытия, буквенно-цифровой ввод для фокусировки на первом сопоставленном элементе и т. Д.
Если важно взаимодействие с пользователем, я бы порекомендовал использовать для этого фреймворк и плагин.Я лично предпочитаю JQuery и JQuery UI, и есть несколько плагинов для выбора выпадающих.Другое преимущество состоит в том, что если клиент отключил JavaScript, или ваш JavaScript по какой-либо причине ошибся, большинство плагинов используют обычный элемент выбора select, который по-прежнему будет работать нормально.
Я использовал этот плагиндля ящика select для простого раскрывающегося списка: http://www.abeautifulsite.net/blog/2011/01/jquery-selectbox-plugin/
Редактировать: Я отменяю эту рекомендацию, поскольку она не работает, если несколько элементов имеют одно и то же имя.Если это важно, вы должны проверить вместо этого плагин selectmenu группы Filament Group: http://filamentgroup.com/lab/jquery_ui_selectmenu_an_aria_accessible_plugin_for_styling_a_html_select/ // Edit
... и плагин автозаполнения jquery для комбинированного списка, также поддерживающегописьменный ввод: http://jqueryui.com/demos/autocomplete/