Je n'ai jamais mis en œuvre cette solution, mais je me suis penché sur un problème similaire, et voici ce que j'essaierais.
Essayez d'abord ceci
D'abord, je verrais si vous pouvez simplement tirer un keypress
événement pour la touche Tab sur l'élément qui a actuellement le focus. Il peut y avoir une manière différente de procéder selon les navigateurs.
Si ça ne marche pas, vous devrez travailler plus dur
En faisant référence à l'implémentation de jQuery, vous devez :
- Écouter pour Tab et Shift+Tab
- Savoir quels éléments sont tabulables
- Comprendre le fonctionnement de l'ordre des onglets
1. Écoutez pour Tab et Shift+Tab
L'écoute de la touche Tab et de la touche Shift+Tab est probablement bien couverte ailleurs sur le web, je vais donc sauter cette partie.
2. Savoir quels éléments peuvent être tabulés
Il est plus difficile de savoir quels éléments peuvent être tabulés. Fondamentalement, un élément est tabulable s'il est focalisable et ne possède pas l'attribut tabindex="-1"
ensemble. Il faut donc se demander quels éléments sont focalisables. Les éléments suivants sont focalisables :
-
input
, select
, textarea
, button
y object
éléments qui ne sont pas désactivés.
-
a
y area
qui ont un href
ou avoir une valeur numérique pour tabindex
set.
- tout élément qui a une valeur numérique pour
tabindex
set.
En outre, un élément est focalisable uniquement si :
- Aucun de ses ancêtres n'est
display: none
.
- La valeur calculée de
visibility
es visible
. Cela signifie que l'ancêtre le plus proche d'avoir visibility
doit avoir une valeur de visible
. Si aucun ancêtre n'a visibility
défini, alors la valeur calculée est visible
.
Plus de détails dans une autre Réponse de Stack Overflow .
3. Comprendre le fonctionnement de l'ordre des onglets
L'ordre de tabulation des éléments dans un document est contrôlé par l'élément tabindex
attribut. Si aucune valeur n'est définie, le tabindex
est effectivement 0
.
El tabindex
La commande du document est : 1, 2, 3, , 0.
Initialement, lorsque le body
(ou aucun élément) a le focus, le premier élément dans l'ordre de tabulation est l'élément non nul le plus bas. tabindex
. Si plusieurs éléments ont le même tabindex
vous allez ensuite dans l'ordre des documents jusqu'à ce que vous atteigniez le dernier élément avec cet élément. tabindex
. Ensuite, vous passez au niveau inférieur suivant tabindex
et le processus continue. Enfin, terminez avec les éléments ayant un zéro (ou vide) tabindex
.
3 votes
Pourquoi avez-vous cette ligne
currentElementId = "";
?1 votes
Je ne pense pas que les navigateurs exposent les informations sur l'ordre des onglets - et l'algorithme utilisé par les navigateurs eux-mêmes est trop compliqué à reproduire. Peut-être pouvez-vous restreindre vos exigences, par exemple "ne considérer que
input
,button
ytextarea
et ignorenttabindex
attribut".0 votes
Nous avons besoin de voir votre
.newElementByTabIndex
parce que c'est ce qui ne fonctionne pas.2 votes
Mais peut-être que la restriction à des balises particulières n'est pas nécessaire.
focus()
existe.0 votes
@Omeid Herat Il est là pour empêcher les autres fonctions de l'utiliser accidentellement à un moment où elles ne devraient pas.
2 votes
@David C'est la fonction qui n'existe pas, d'où ma question :D
0 votes
Je reviens souvent sur cette question avec des problèmes similaires et aucune des réponses ne me convient exactement. Ce que j'ai découvert, c'est qu'il est difficile de gérer le focus pendant les événements de tabulation. En général, cela peut être résolu en modifiant le paramètre
tabIndex
des éléments sur lesquels vous ne voulez pas être tabulé pour-1
lorsque l'ordre des tabulations est pertinent, puis revenir à0
lorsque l'ordre des onglets n'est plus pertinent.