绑定到$(document)的keydown事件导致了额外的循环,这意味着选择将在不同的位置结束。
该事件现在绑定到$('nav')并在blur函数中解除绑定,这已移除任何不需要的触发器,现在行为如预期。
最终JS如下:-
$(".parent").focus(function(){
$(this).closest(".nav__dropdown").addClass("hover");
$('.hover .nav__dropdown__content a').first().addClass('navSelected');
$('nav').keydown(function(e) {
var selected = $('.navSelected');
var sub = $('.hover .nav__dropdown__content a');
if(e.which === 40){
if(selected){
selected.removeClass('navSelected');
next = selected.next();
if(next.length > 0){
selected = next.addClass('navSelected');
}else{
selected = sub.eq(0).addClass('navSelected');
}
}
}
if(e.which === 38){
if(selected){
selected.removeClass('navSelected');
next = selected.prev();
if(next.length > 0){
selected = next.addClass('navSelected');
}else{
selected = sub.last().addClass('navSelected');
}
}
}
if(e.which === 13){
if(selected){
selected.trigger('click');
}
}
})
}).blur(function(){
$('nav').unbind('keydown');
$(".nav__dropdown").removeClass("hover");
$(document).removeClass("navSelected");
})