A barra de navegação do Bootstrap 5 contém menus suspensos.
Os menus suspensos têm teclas de atalho sublinhadas como a
, n
, s
, e
:
<div class="btn-group">
<button type="button" class="btn btn-danger dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Action
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#"><u>A</u>ction</a></li>
<li><a class="dropdown-item" href="#">A<u>n</u>other action</a></li>
<li><a class="dropdown-item" href="#"><u>S</u>omething else here</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">S<u>e</u>parated link</a></li>
</ul>
</div>
Como ativar o item de menu se a tecla for pressionada no teclado? Por exemplo, se o menu suspenso estiver aberto, pressionar A deve agir como se o item do menu Ação fosse clicado.
jsfiddle: https://jsfiddle.net/b6or2s5e/
As setas esquerda e direita já são tratadas usando
Como usar as teclas de seta esquerda e direita para navegar na barra de navegação do bootstrap
document.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll('.dropdown').forEach(function (el) {
el.addEventListener('shown.bs.dropdown', function () {
document.addEventListener('keydown', function (e) {
const click = new MouseEvent("click", {
bubbles: true,
cancelable: true,
view: window,
})
if (e.key === "ArrowRight") {
const o = getNextSibling(e.target.closest('.dropdown'), '.dropdown')
if (!o) {
document.querySelector('.dropdown-toggle').dispatchEvent(click)
} else {
o.querySelector('.Xdropdown-toggle').dispatchEvent(click)
}
} else if (e.key === "ArrowLeft") {
const o = getPrevSibling(e.target.closest('.dropdown'), '.dropdown')
if (!o) {
const ar = document.querySelectorAll('.dropdown-toggle')
ar[ar.length - 1].dispatchEvent(click)
} else {
o.querySelector('.dropdown-toggle').dispatchEvent(click)
}
}
}, { once: true })
})
})
})
Como adicionar manipulação de teclas de atalho também?
Aqui está um snippet atualizado com uma abordagem dinâmica, obtendo os elementos sublinhados e usando um loop forEach sobre a lista de nós dos elementos sublinhados para comparar um evento na janela com cada elemento sublinhado para o qual textContent foi convertido e depois comparado. Se houver uma correspondência, executamos no elemento correspondente.
keydown
toLowerCase()
click()
Acredito que você esteja perguntando se pode adicionar teclas de controle e/ou alt , não tenho 100% de certeza de que sua pergunta está aqui, mas você pode adicionar qualquer condicional em termos do que deseja controlar com o pressionamento de tecla. Basta adicionar a lógica à condicional.
Veja mais notas no trecho abaixo ...