it-swarm.dev

Habilitar la navegación del teclado en el Bootstrap menú desplegable

¿Es posible navegar usando el teclado al menú desplegable usando Taby navega con las teclas de flecha a los subelementos del menú desplegable?

Aquí está el código que tengo ahora:

<input type="text" value="click tab to jump to the drop down."/>
<div class="bs-docs-example">
    <div class="dropdown clearfix">
      <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu" style="display: block; position: static; margin-bottom: 5px; *width: 180px;">
        <li><a tabindex="-1" href="#">Menu Item A</a></li>
        <li><a tabindex="-1" href="#">Menu Item B</a></li>
        <li><a tabindex="-1" href="#">Menu Item C</a></li>
        <li class="divider"></li>
        <li><a tabindex="-1" href="#">Menu Item A1</a></li>
            <li class="dropdown-submenu">
                <a tabindex="-1" href="#">Menu Item B1</a>
                <ul class="dropdown-menu">
                    <li><a tabindex="-1" href="#">You should navigate here with the keyboard.</a></li>
                    <li><a tabindex="-1" href="#">Thanks For your Help!</a></li>
                </ul>
            </li>
      </ul>
    </div>
</div>

http://jsfiddle.net/MGwVM/1/

14
JavaSheriff

Actualizar

Bootstrap ahora admite teclas arriba/abajo como estándar.

Entonces si quieres Tab para activar el menú desplegable, solo obtenga el código de clave (9) y haga lo siguiente:

$('.input-group input').keydown(function(e){
    if(e.which == 9){ // tab
        e.preventDefault();
        $(this).parent().find('.dropdown-toggle').click();
        $(this).parent().find('.dropdown-menu a:first').focus();
    }
});

Y si desea agregar más funcionalidades para cuando el usuario se centra en un elemento del menú desplegable:

$('.dropdown-menu a').keydown(function(e){
    switch(e.which){
        case 36: // home
            e.preventDefault();
            $(this).closest('.dropdown-menu').find('a:first').focus();
            break;
        case 35: // end
            e.preventDefault();
            $(this).closest('.dropdown-menu').find('a:last').focus();
            break;
    }
});

Ver este JSFiddle para una demostración.

11
rybo111

Buen ejemplo.

Pero, ¿por qué estableciste un setTimeout? ¿Alguna razón específica?

setTimeout(function(){
    $(".search-option:first").focus();
},100);

Hice el mismo ejemplo, simulando un cuadro de selección de entrada, sin tiempo de espera. Mira esto .

1
nneeggrroo