Estoy tratando de mover el foco al siguiente elemento en la secuencia de pestañas según el elemento actual que tiene el foco. Hasta ahora no he encontrado nada en mis búsquedas.
function OnFocusOut()
{
var currentElement = $get(currentElementId); // ID set by OnFocusIn
currentElementId = "";
currentElement.nextElementByTabIndex.focus();
}
Por supuesto, nextElementByTabIndex es la parte clave para que esto funcione. ¿Cómo encuentro el siguiente elemento en la secuencia de pestañas? La solución debería basarse en JScript y no en algo como JQuery.
javascript
jscript.net
JadziaMD
fuente
fuente
currentElementId = "";
?input
,button
ytextarea
las etiquetas y hacer caso omisotabindex
de atributos"..newElementByTabIndex
código porque eso es lo que no funciona.focus()
método existe.Respuestas:
Sin jquery: En primer lugar, en sus elementos tabulables, agregue
class="tabable"
esto y nos permitirá seleccionarlos más tarde. (No olvide el prefijo del selector de clase "." En el código siguiente)fuente
var tabbables = document.getElementsByName("tabable");
con elvar tabbables = document.getElementsByTagName("input");
lugarvar tabbables = document.querySelectorAll("input, textarea, button")
// IE8 +, obtenga una referencia a todas las tabulaciones sin modificar su HTML.Nunca he implementado esto, pero he investigado un problema similar y esto es lo que intentaría.
Prueba esto primero
Primero, vería si pudiera simplemente disparar un
keypress
evento para la tecla Tab en el elemento que actualmente tiene el foco. Puede haber una forma diferente de hacer esto para diferentes navegadores.Si eso no funciona, tendrá que trabajar más duro ...
Haciendo referencia a la implementación de jQuery, debe:
1. Escuche Tab y Shift + Tab
Escuchar Tab y Shift + Tab probablemente estén bien cubiertos en otras partes de la web, por lo que omitiré esa parte.
2. Sepa qué elementos se pueden tabular
Saber qué elementos se pueden tabular es más complicado. Básicamente, un elemento se puede tabular si se puede enfocar y no tiene el atributo
tabindex="-1"
establecido. Entonces debemos preguntarnos qué elementos son enfocables. Los siguientes elementos son enfocables:input
,select
,textarea
,button
, Yobject
elementos que no estén deshabilitadas.a
yarea
elementos que tienenhref
o tienen un valor numérico para eltabindex
conjunto.tabindex
set.Además, un elemento solo se puede enfocar si:
display: none
.visibility
esvisible
. Esto significa que el ancestro más cercano que se hayavisibility
establecido debe tener un valor devisible
. Si no se havisibility
establecido ningún antepasado , el valor calculado esvisible
.Más detalles están en otra respuesta de Stack Overflow .
3. Comprender cómo funciona el orden de tabulación
El orden de tabulación de los elementos de un documento está controlado por el
tabindex
atributo. Si no se establece ningún valor, eltabindex
es efectivamente0
.El
tabindex
orden del documento es: 1, 2, 3,…, 0.Inicialmente, cuando el
body
elemento (o ningún elemento) tiene el foco, el primer elemento en el orden de tabulación es el menor distinto de cerotabindex
. Si varios elementos tienen lo mismotabindex
, siga el orden del documento hasta que llegue al último elemento con esotabindex
. Luego pasa al siguiente nivel más bajotabindex
y el proceso continúa. Finalmente, termine con esos elementos con un cero (o vacío)tabindex
.fuente
Aquí hay algo que construí para este propósito:
caracteristicas:
fuente
nextElementSibling
puede haber no enfocable, el siguiente enfocable no puede ser un hermano.hidden
y también cubrirtextarea
yselect
.He creado un sencillo plugin de jQuery , que hace precisamente esto. Utiliza el selector ': tabbable' de jQuery UI para encontrar el siguiente elemento 'tabbable' y lo selecciona.
Uso de ejemplo:
fuente
El núcleo de la respuesta radica en encontrar el siguiente elemento:
Uso:
Observe que no me importa priorizar
tabIndex
.fuente
Como se mencionó en un comentario anterior, no creo que ningún navegador exponga información de orden de pestaña. Aquí una aproximación simplificada de lo que hace el navegador para obtener el siguiente elemento en orden de tabulación:
Esto solo considera algunas etiquetas e ignora los
tabindex
atributos, pero podría ser suficiente dependiendo de lo que esté tratando de lograr.fuente
Parece que puede verificar la
tabIndex
propiedad de un elemento para determinar si es enfocable. Un elemento que no se puede enfocar tiene un valortabindex
de "-1".Entonces solo necesita conocer las reglas para las tabulaciones:
tabIndex="1"
tiene la mayor prioridad.tabIndex="2"
tiene la siguiente prioridad más alta.tabIndex="3"
es el siguiente, y así sucesivamente.tabIndex="0"
(o tabulado por defecto) tiene la prioridad más baja.tabIndex="-1"
(o no tabable de forma predeterminada) no actúa como una tabulación.A continuación, se muestra un ejemplo de cómo crear la lista de tabulaciones, en secuencia, utilizando Javascript puro:
Primero recorremos el DOM, recopilando todas las tabulaciones en secuencia con su índice. Luego armamos la lista final. Observe que agregamos los elementos con
tabIndex="0"
al final de la lista, después de los elementos contabIndex
1, 2, 3, etc.Para ver un ejemplo completamente funcional, donde puede usar la tecla "Enter", consulte este violín .
fuente
Tabbable es un pequeño paquete JS que le brinda una lista de todos los elementos tabbables en orden de tabulación . Para que pueda encontrar su elemento dentro de esa lista, luego concentrarse en la siguiente entrada de la lista.
El paquete maneja correctamente los complicados casos extremos mencionados en otras respuestas (por ejemplo, ningún antepasado puede serlo
display: none
). ¡Y no depende de jQuery!Al momento de escribir estas líneas (versión 1.1.1), tiene las advertencias de que no es compatible con IE8 y que los errores del navegador impiden que se maneje
contenteditable
correctamente.fuente
fuente
Esta es mi primera publicación en SO, así que no tengo suficiente reputación para comentar la respuesta aceptada, pero tuve que modificar el código a lo siguiente:
El cambio de var a constante no es crítico. El cambio principal es que nos deshacemos del selector que comprueba tabindex! = "-1". Luego, más tarde, si el elemento tiene el atributo tabindex Y está configurado en "-1", NO lo consideramos enfocable.
La razón por la que necesitaba cambiar esto fue porque al agregar tabindex = "- 1" a un
<input>
, este elemento todavía se consideraba enfocable porque coincide con el selector "input [type = text]: not ([disabled])". Mi cambio es equivalente a "si somos una entrada de texto no deshabilitada, y tenemos un atributo tabIndex, y el valor de ese atributo es -1, entonces no deberíamos ser considerados enfocables.Creo que cuando el autor de la respuesta aceptada editó su respuesta para tener en cuenta el atributo tabIndex, no lo hizo correctamente. Por favor avíseme si este no es el caso
fuente
Existe la propiedad tabindex que se puede establecer en el componente. Especifica en qué orden se deben iterar los componentes de entrada al seleccionar uno y presionar tabulador. Los valores superiores a 0 están reservados para la navegación personalizada, 0 es "en orden natural" (por lo que se comportaría de manera diferente si se configura para el primer elemento), -1 significa que no se puede enfocar con el teclado:
También se puede configurar para algo más que los campos de entrada de texto, pero no es muy obvio lo que haría allí, en todo caso. Incluso si la navegación funciona, tal vez sea mejor usar "orden natural" para cualquier otra cosa que los elementos de entrada del usuario muy obvios.
No, no necesita JQuery ni ningún script para admitir esta ruta de navegación personalizada. Puede implementarlo en el lado del servidor sin ningún soporte de JavaScript. Por otro lado, la propiedad también funciona bien en el marco de React, pero no la requiere.
fuente
Aquí hay una versión más completa de enfocarse en el siguiente elemento. Sigue las pautas de las especificaciones y ordena la lista de elementos correctamente mediante tabindex. Además, se define una variable inversa si desea obtener el elemento anterior.
fuente
Esta es una mejora potencial de la gran solución que ofrecieron @Kano y @Mx . Si desea conservar el orden de TabIndex, agregue este orden en el medio:
fuente
Puedes llamar a esto:
Lengüeta:
Mayús + Tabulador:
Modifico jquery.tabbable plugin para completa.
fuente
Nigromante.
Tengo un montón de 0-tabIndexes, que quería navegar por teclado.
Como en ese caso, solo importaba el ORDEN de los elementos, lo hice usando
document.createTreeWalker
Entonces, primero crea el filtro (solo desea elementos [visibles], que tienen un atributo "tabIndex" con un valor NUMÉRICO.
Luego configura el nodo raíz, más allá del cual no desea buscar. En mi caso,
this.m_tree
es un elemento ul que contiene un árbol toggable. Si desea el documento completo en su lugar, simplemente reemplácelothis.m_tree
condocument.documentElement
.Luego establece el nodo actual en el elemento activo actual:
Luego regresa
ni.nextNode()
oni.previousNode()
.Nota:
esto NO devolverá las pestañas en el orden correcto si tiene tabIndices! = 0 y el orden de los elementos NO es el orden de tabIndex. En el caso de tabIndex = 0, tabOrder es siempre el orden de los elementos, por lo que esto funciona (en ese caso).
Tenga en cuenta que el ciclo while
solo está ahí si lo desea si tiene criterios adicionales que no puede filtrar en el filtro pasado a createTreeWalker.
Tenga en cuenta que esto es TypeScript, debe eliminar todos los tokens detrás de dos puntos (:) y entre corchetes angulares (<>), por ejemplo
<Element>
o:(node: Node) => number
para obtener JavaScript válido.Aquí, como servicio, el JS transpilado:
fuente
¿Especificó sus propios valores de tabIndex para cada elemento que desea recorrer? si es así, puede intentar esto:
Estás usando jquery, ¿verdad?
fuente
Revisé las soluciones anteriores y las encontré bastante largas. Se puede lograr con solo una línea de código:
o
aquí currentElement puede ser cualquier, es decir, document.activeElement o this si el elemento actual está en el contexto de la función.
Realicé un seguimiento de los eventos de tabulación y shift-tab con evento de teclado
una vez que tenga la dirección del cursor, puede usar los métodos
nextElementSibling.focus
opreviousElementSibling.focus
fuente