2013-02-26 2 views
2

Я пытаюсь сделать выпадающее меню доступным с клавиатуры (используя только Tab, без ключей доступа). Я не могу понять, как сделать доступными подтышки.jQuery: доступ к меню выпадающего меню через Tab

Желаемое поведение: когда «элемент» щелкнут или имеет фокус, отобразите список; когда «item» теряет фокус (при размытии), если «подпункт» не имеет фокуса (что означало бы, что к нему было обращено через клавиатуру), скройте список.

Fiddle: http://jsfiddle.net/DBdbz/

HTML

<p id="ui"><a href="#">Item</a></p> 
<ul> 
    <li><a href="#">Sub item 1</a></li> 
    <li><a href="#">Sub item 1</a></li> 
    <li><a href="#">Sub item 1</a></li> 
</ul> 

JS

$('ul').hide(); 

$('#ui a').on('focus', function() { 
    $('ul').show(); 
}); 

$('#ui a').on('blur', function() { 
    $('ul').hide(); 
}); 

Спасибо за вашу помощь.

ответ

2

Что об этом: http://jsfiddle.net/DBdbz/6/?

Чтобы получить фокус/размытия для работы в любом браузере, единственное, что требуется, это TabIndex на данный элемент (независимо от того, какой из них, увидеть Ли link):

<p id="ui"><a href="#" tabindex="1">Item</a></p> 
<ul> 
    <li><a href="#">Sub item 1</a></li> 
    <li><a href="#">Sub item 1</a></li> 
    <li><a href="#">Sub item 1</a></li> 
</ul> 

И здесь приходит JS:

$('ul').hide(); 

$('#ui a').on('focus', function() { 
    $('ul').show(); 
}); 

$('#ui a').on('keydown', function(e) { 
    if (e.keyCode == 9) { 
    $('ul').addClass('tab'); 
    } 
}); 

$('ul').on('mouseover', function() { 
    $('ul').addClass('mouse'); 
}); 

$('ul').on('mouseout', function() { 
    $('ul').removeClass('mouse').removeClass('tab'); 
}); 

$('ul li:last-child a').on('blur', function() { 
    if ($('ul').hasClass('tab')) { 
    $('ul').hide().removeClass('tab'); 
    } 
}); 

$('#ui a').on('blur', function() { 
    if (!$('ul').is('.tab, .mouse')) { 
    $('ul').hide(); 
    } 
}); 
+0

Это работает. Благодаря! – bobylapointe

0

Вы можете попробовать следующее:

$('ul').hide(); 

$('#ui a').on('focus', function() { 
    $('ul').show(); 
}); 

$('#ui a').on('blur', function() { 
    if ($('ul li').is(':focus').length < 1) $('ul').hide(); 
}); 

Это только скрывает ул, если ни один из литий ЛУ никогда сфокусирован.

+0

Здравствуйте, спасибо за ваш ответ. Я уже пробовал что-то подобное, но оно не работает. В тот момент, когда «#ui a» теряет размытие (когда происходит ваш тест), ни один из подпунктов не имеет фокуса. – bobylapointe

+0

, а затем заверните строку if в течение небольшого таймаута, например: setTimeout (function() {if ($ ('ul li') .... hide();}, 20); " – Alex

+0

Это не работа: подэлемент действительно получает фокус, но когда функция отключается, список скрыт. См. http://jsfiddle.net/DBdbz/2/ – bobylapointe

2

Вот еще одна скрипка, которая правильно выполняет табуляцию. Ваша оригинальная скрипка не открывала меню, когда я нажимаю «Item», поэтому я не уверен, что это значит.

http://jsfiddle.net/DBdbz/4/

Этот код идет после того, как ваша, чтобы сделать работу: табуляции

$("ul a").on('focus', function() { 
    $('ul').show(); 
}); 

$("ul a").on('blur', function() { 
    $('ul').hide(); 
}); 
+0

Интересно, я только что протестировал его на IE 9, Opera 12.10 и Chromium latest (мой браузер по умолчанию - последний Firefox). Мой код работал везде, но на Chromium. – bobylapointe

+0

Вот что я использую. –

+4

Обратите внимание: http://www.quirksmode.org/dom/events/blurfocus.html, где указано, что Chrome не запускает события фокуса/размытия в ссылках, когда используется мышь, и Safari не запускает их когда-либо. –

Смежные вопросы