Estou tentando mover o foco para o próximo elemento na sequência de guias com base no elemento atual que tem foco. Até agora não encontrei nada em minhas pesquisas.
function OnFocusOut()
{
var currentElement = $get(currentElementId); // ID set by OnFocusIn
currentElementId = "";
currentElement.nextElementByTabIndex.focus();
}
Claro que o nextElementByTabIndex é a parte chave para que isso funcione. Como encontro o próximo elemento na sequência de guias? A solução precisaria ser baseada em JScript e não em algo como JQuery.
javascript
jscript.net
JadziaMD
fonte
fonte
currentElementId = "";
?input
,button
etextarea
marcar e ignorar otabindex
atributo"..newElementByTabIndex
código porque ele não está funcionando.focus()
método existe.Respostas:
Sem jquery: em primeiro lugar, em seus elementos tabuláveis, adicione
class="tabable"
isso para que possamos selecioná-los mais tarde. (Não se esqueça do prefixo do seletor de classe "." No código abaixo)fonte
var tabbables = document.getElementsByName("tabable");
comvar tabbables = document.getElementsByTagName("input");
em vezvar tabbables = document.querySelectorAll("input, textarea, button")
// IE8 +, obtém uma referência para todos os tabbables sem modificar seu HTML.Nunca implementei isso, mas já analisei um problema semelhante e aqui está o que eu tentaria.
Tente isto primeiro
Primeiro, veria se você poderia simplesmente disparar um
keypress
evento para a tecla Tab no elemento que está em foco atualmente. Pode haver uma maneira diferente de fazer isso para navegadores diferentes.Se isso não funcionar, você terá que trabalhar mais ...
Fazendo referência à implementação do jQuery, você deve:
1. Ouça Tab e Shift + Tab
Ouvir Tab e Shift + Tab provavelmente são bem abordadas em outros lugares na web, então vou pular essa parte.
2. Saiba quais elementos podem ser tabulados
Saber quais elementos podem ser tabulados é mais complicado. Basicamente, um elemento pode ser tabulado se puder ser focalizado e não tiver o atributo
tabindex="-1"
definido. Portanto, devemos perguntar quais elementos são focalizáveis. Os seguintes elementos podem ser focalizados:input
,select
,textarea
,button
, Eobject
elementos que não são desativados.a
earea
elementos que possuem umhref
ou têm um valor numérico paratabindex
conjunto.tabindex
definir.Além disso, um elemento pode ser focalizado apenas se:
display: none
.visibility
évisible
. Isso significa que o ancestral mais próximo a servisibility
definido deve ter um valor devisible
. Se nenhum ancestral foivisibility
definido, o valor calculado évisible
.Mais detalhes estão em outra resposta do Stack Overflow .
3. Entenda como funciona a ordem das guias
A ordem de tabulação dos elementos em um documento é controlada pelo
tabindex
atributo. Se nenhum valor for definido, otabindex
é eficaz0
.A
tabindex
ordem do documento é: 1, 2, 3,…, 0.Inicialmente, quando o
body
elemento (ou nenhum elemento) tem foco, o primeiro elemento na ordem de tabulação é o menor diferente de zerotabindex
. Se vários elementos tiverem o mesmotabindex
, então você vai na ordem do documento até chegar ao último elemento com issotabindex
. Então você passa para o próximo nível mais baixotabindex
e o processo continua. Finalmente, termine com esses elementos com um zero (ou vazio)tabindex
.fonte
Aqui está algo que construí para este propósito:
Recursos:
fonte
nextElementSibling
podem não ser focusable, o próximo focalizável pode não ser um irmão.hidden
e também cobrirtextarea
eselect
.Eu criei um plugin jQuery simples que faz exatamente isso. Ele usa o seletor ': tabbable' do jQuery UI para encontrar o próximo elemento 'tabbable' e o seleciona.
Exemplo de uso:
fonte
O cerne da resposta está em encontrar o próximo elemento:
Uso:
Observe que não me importo em priorizar
tabIndex
.fonte
Conforme mencionado em um comentário acima, não acho que nenhum navegador exponha informações de ordem de guias. Aqui está uma aproximação simplificada do que o navegador faz para obter o próximo elemento na ordem das guias:
Isso considera apenas algumas tags e ignora o
tabindex
atributo, mas pode ser o suficiente, dependendo do que você está tentando alcançar.fonte
Parece que você pode verificar a
tabIndex
propriedade de um elemento para determinar se ele pode ser focalizado. Um elemento que não pode ser focalizado tem um valortabindex
de "-1".Então você só precisa conhecer as regras para paradas de tabulação:
tabIndex="1"
tem o maior sacerdócio.tabIndex="2"
tem a próxima prioridade mais alta.tabIndex="3"
é o próximo e assim por diante.tabIndex="0"
(ou tabulável por padrão) tem a prioridade mais baixa.tabIndex="-1"
(ou não tabulável por padrão) não atua como uma parada de tabulação.Aqui está um exemplo de como construir a lista de paradas de tabulação, em sequência, usando Javascript puro:
Primeiro percorremos o DOM, coletando todas as paradas de tabulação em sequência com seu índice. Em seguida, montamos a lista final. Observe que adicionamos os itens com
tabIndex="0"
no final da lista, após os itens comtabIndex
1, 2, 3, etc.Para obter um exemplo funcional, onde você pode navegar usando a tecla "enter", verifique este violino .
fonte
Tabbable é um pequeno pacote JS que fornece uma lista de todos os elementos tabuláveis em ordem de tabulação . Assim, você pode encontrar seu elemento dentro dessa lista e, em seguida, focar na próxima entrada da lista.
O pacote trata corretamente os casos extremos complicados mencionados em outras respostas (por exemplo, nenhum ancestral pode ser
display: none
). E não depende do jQuery!No momento da redação deste artigo (versão 1.1.1), ele tinha as ressalvas de que não suportava o IE8 e que os erros do navegador o impediam de funcionar
contenteditable
corretamente.fonte
fonte
Esta é minha primeira postagem no SO, então não tenho reputação suficiente para comentar a resposta aceita, mas tive que modificar o código para o seguinte:
A mudança de var para constante não é crítica. A principal mudança é que nos livramos do seletor que verifica tabindex! = "-1". Posteriormente, se o elemento tiver o atributo tabindex E for definido como "-1", NÃO o consideramos focalizável.
O motivo pelo qual precisei mudar isso foi porque ao adicionar tabindex = "- 1" a um
<input>
, esse elemento ainda foi considerado focalizável porque corresponde ao seletor "input [type = text]: not ([disabled])". Minha mudança é equivalente a "se formos uma entrada de texto não desabilitada e tivermos um atributo tabIndex, e o valor desse atributo for -1, então não devemos ser considerados focalizáveis.Eu acredito que quando o autor da resposta aceita editou sua resposta para explicar o atributo tabIndex, ele não o fez corretamente. Por favor me avise se este não for o caso
fonte
Existe a propriedade tabindex que pode ser configurada no componente. Ele especifica em qual ordem os componentes de entrada devem ser iterados ao selecionar um e pressionar a guia. Valores acima de 0 são reservados para navegação personalizada, 0 é "em ordem natural" (portanto, se comportaria de maneira diferente se definido para o primeiro elemento), -1 significa não focalizável no teclado:
Ele também pode ser definido para algo diferente dos campos de entrada de texto, mas não é muito óbvio o que faria lá, se é que faria alguma coisa. Mesmo se a navegação funcionar, talvez seja melhor usar "ordem natural" para qualquer outra coisa do que os elementos de entrada do usuário muito óbvios.
Não, você não precisa de JQuery ou qualquer script para oferecer suporte a esse caminho de navegação personalizado. Você pode implementá-lo no lado do servidor sem qualquer suporte a JavaScript. Por outro lado, a propriedade também funciona bem no framework React, mas não a exige.
fonte
Aqui está uma versão mais completa de como focar no próximo elemento. Ele segue as diretrizes das especificações e classifica a lista de elementos corretamente usando tabindex. Além disso, uma variável reversa é definida se você deseja obter o elemento anterior.
fonte
Este é um potencial aprimoramento para a grande solução que o @Kano e o @Mx ofereceram. Se você deseja preservar a ordem TabIndex, adicione esta classificação no meio:
fonte
Você pode chamar isso de:
Aba:
Shift + Tab:
I modificar jquery.tabbable plugin para completo.
fonte
Necromante.
Eu tenho um buch de 0-tabIndexes, que eu queria navegar pelo teclado.
Como, nesse caso, apenas a ORDEM dos elementos importava, fiz isso usando
document.createTreeWalker
Portanto, primeiro você cria o filtro (você deseja apenas elementos [visíveis], que têm um atributo "tabIndex" com um valor NUMERICAL.
Em seguida, você define o nó raiz, além do qual não deseja pesquisar. No meu caso,
this.m_tree
é um elemento ul contendo uma árvore toggable. Se você quiser o documento inteiro, basta substituirthis.m_tree
pordocument.documentElement
.Em seguida, você define o nó atual para o elemento ativo atual:
Então você retorna
ni.nextNode()
ouni.previousNode()
.Observação:
isso NÃO retornará as guias na ordem correta se você tiver tabIndices! = 0 e a ordem do elemento NÃO for a ordem tabIndex. No caso de tabIndex = 0, o tabOrder é sempre a ordem dos elementos, por isso funciona (nesse caso).
Observe que o loop while
está lá apenas se você desejar, se tiver critérios adicionais que não podem ser filtrados no filtro passado para createTreeWalker.
Observe que este é o TypeScript, você precisa remover todos os tokens atrás dos dois pontos (:) e entre colchetes angulares (<>), por exemplo,
<Element>
ou:(node: Node) => number
para obter um JavaScript válido.Aqui como um serviço, o JS transpilado:
fonte
Você especificou seus próprios valores tabIndex para cada elemento que deseja percorrer? em caso afirmativo, você pode tentar isto:
Você está usando jquery, certo?
fonte
Eu verifiquei as soluções acima e as achei bastante extensas. Isso pode ser realizado com apenas uma linha de código:
ou
aqui, currentElement pode ser qualquer, por exemplo, document.activeElement ou this se o elemento atual estiver no contexto da função.
Acompanhei eventos tab e shift-tab com evento keydown
depois de ter a direção do cursor, você pode usar os métodos
nextElementSibling.focus
oupreviousElementSibling.focus
fonte