J'essaie de déplacer le focus vers l'élément suivant dans la séquence d'onglets en fonction de l'élément actuel qui a le focus. Jusqu'à présent, je n'ai rien trouvé dans mes recherches.
function OnFocusOut()
{
var currentElement = $get(currentElementId); // ID set by OnFocusIn
currentElementId = "";
currentElement.nextElementByTabIndex.focus();
}
Bien sûr, le nextElementByTabIndex est l'élément clé pour que cela fonctionne. Comment trouver l'élément suivant dans la séquence d'onglets? La solution devrait être basée sur JScript et non sur quelque chose comme JQuery.
javascript
jscript.net
JadziaMD
la source
la source
currentElementId = "";
?input
,button
ettextarea
balises et ignorer l'tabindex
attribut"..newElementByTabIndex
code car cela ne fonctionne pas.focus()
méthode existe.Réponses:
Sans jquery: Tout d'abord, sur vos éléments tabulables, ajoutez
class="tabable"
ceci nous permettra de les sélectionner plus tard. (N'oubliez pas le préfixe du sélecteur de classe "." Dans le code ci-dessous)la source
var tabbables = document.getElementsByName("tabable");
par à lavar tabbables = document.getElementsByTagName("input");
placevar tabbables = document.querySelectorAll("input, textarea, button")
// IE8 +, obtenez une référence à tous les tabbables sans modifier votre HTML.Je n'ai jamais implémenté cela, mais j'ai examiné un problème similaire, et voici ce que j'essaierais.
Essayez ceci en premier
Tout d'abord, je verrais si vous pouviez simplement déclencher 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 faire cela pour différents navigateurs.Si cela ne fonctionne pas, vous devrez travailler plus dur…
En référençant l'implémentation jQuery, vous devez:
1. Écoutez Tab et Shift + Tab
L'écoute de Tab et Shift + Tab est probablement bien couverte ailleurs sur le Web, je vais donc sauter cette partie.
2. Sachez quels éléments peuvent être tabulés
Savoir quels éléments peuvent être tabulés est plus délicat. Fondamentalement, un élément peut être tabulé s'il est focusable et n'a pas l'attribut
tabindex="-1"
défini. Alors nous devons nous demander quels éléments sont focalisables. Les éléments suivants sont focalisables:input
,select
,textarea
,button
Et desobject
éléments qui ne sont pas désactivés.a
et lesarea
éléments qui ont unehref
valeur numérique ou une valeur pourtabindex
set.tabindex
set.De plus, un élément n'est focalisable que si:
display: none
.visibility
estvisible
. Cela signifie que l'ancêtre le plus proche à avoirvisibility
défini doit avoir la valeurvisible
. Si aucun ancêtre n'estvisibility
défini, la valeur calculée estvisible
.Plus de détails sont dans une autre réponse Stack Overflow .
3. Comprendre le fonctionnement de l'ordre de tabulation
L'ordre de tabulation des éléments dans un document est contrôlé par l'
tabindex
attribut. Si aucune valeur n'est définie, letabindex
est effectivement0
.L'
tabindex
ordre du document est: 1, 2, 3,…, 0.Initialement, lorsque l'
body
élément (ou aucun élément) a le focus, le premier élément dans l'ordre de tabulation est le plus petit différent de zérotabindex
. Si plusieurs éléments ont les mêmes élémentstabindex
, vous passez dans l'ordre des documents jusqu'à ce que vous atteigniez le dernier élément avec celatabindex
. Ensuite, vous passez au niveau le plus bas suivanttabindex
et le processus se poursuit. Enfin, terminez avec ces éléments avec un zéro (ou vide)tabindex
.la source
Voici quelque chose que je construis à cet effet:
Fonctionnalités:
la source
nextElementSibling
focusable peut ne pas être focusable, le focusable suivant peut ne pas être un frère ou une sœur.hidden
et également couvrirtextarea
etselect
.J'ai créé un simple plugin jQuery qui fait exactement cela. Il utilise le sélecteur ': tabbable' de jQuery UI pour trouver l'élément 'tabbable' suivant et le sélectionne.
Exemple d'utilisation:
la source
Le cœur de la réponse réside dans la recherche de l'élément suivant:
Usage:
Remarquez que je me fiche de la priorité
tabIndex
.la source
Comme mentionné dans un commentaire ci-dessus, je ne pense pas que les navigateurs exposent des informations sur l'ordre des onglets. Voici une approximation simplifiée de ce que fait le navigateur pour obtenir l'élément suivant dans l'ordre de tabulation:
Cela ne prend en compte que certaines balises et ignore les
tabindex
attributs, mais cela peut suffire en fonction de ce que vous essayez de réaliser.la source
Il semble que vous puissiez vérifier la
tabIndex
propriété d'un élément pour déterminer s'il est focalisable. Un élément qui n'est pas focalisable a untabindex
"-1".Ensuite, il vous suffit de connaître les règles des taquets de tabulation:
tabIndex="1"
a la priorité la plus élevée.tabIndex="2"
a la deuxième priorité la plus élevée.tabIndex="3"
est le suivant, et ainsi de suite.tabIndex="0"
(ou tabbable par défaut) a la priorité la plus basse.tabIndex="-1"
(ou non tabbable par défaut) n'agit pas comme un taquet de tabulation.Voici un exemple de construction de la liste des taquets de tabulation, en séquence, en utilisant du Javascript pur:
Nous parcourons d'abord le DOM, en rassemblant tous les arrêts de tabulation en séquence avec leur index. Nous assemblons ensuite la liste finale. Notez que nous ajoutons les éléments avec
tabIndex="0"
à la toute fin de la liste, après les éléments avec untabIndex
de 1, 2, 3, etc.Pour un exemple pleinement fonctionnel, où vous pouvez naviguer à l'aide de la touche "Entrée", consultez ce violon .
la source
Tabbable est un petit package JS qui vous donne une liste de tous les éléments tabables dans l'ordre de tabulation . Ainsi, vous pouvez trouver votre élément dans cette liste, puis vous concentrer sur l'entrée de liste suivante.
Le paquet gère correctement les cas extrêmes compliqués mentionnés dans d'autres réponses (par exemple, aucun ancêtre ne peut l'être
display: none
). Et cela ne dépend pas de jQuery!Au moment d'écrire ces lignes (version 1.1.1), il a mis en garde qu'il ne prend pas en charge IE8 et que les bogues du navigateur l'empêchent de gérer
contenteditable
correctement.la source
la source
C'est mon premier article sur SO, donc je n'ai pas assez de réputation pour commenter la réponse acceptée, mais j'ai dû modifier le code comme suit:
Le changement de var en constant n'est pas critique. Le principal changement est que nous nous débarrassons du sélecteur qui vérifie tabindex! = "-1". Ensuite, si l'élément a l'attribut tabindex ET qu'il est mis à "-1", nous ne le considérons PAS focussable.
La raison pour laquelle j'avais besoin de changer cela était parce que lors de l'ajout de tabindex = "- 1" à un
<input>
, cet élément était toujours considéré comme focalisable car il correspond au sélecteur "input [type = text]: not ([disabled])". Ma modification est équivalente à "si nous sommes une entrée de texte non désactivée, et que nous avons un attribut tabIndex, et que la valeur de cet attribut est -1, alors nous ne devrions pas être considérés comme focalisables.Je crois que lorsque l'auteur de la réponse acceptée a modifié sa réponse pour tenir compte de l'attribut tabIndex, il ne l'a pas fait correctement. S'il vous plaît laissez-moi savoir si ce n'est pas le cas
la source
Il existe la propriété tabindex qui peut être définie sur le composant. Il spécifie dans quel ordre les composants d'entrée doivent être itérés lors de la sélection d'un et en appuyant sur tab. Les valeurs supérieures à 0 sont réservées à la navigation personnalisée, 0 est "dans l'ordre naturel" (il se comporterait donc différemment s'il était défini pour le premier élément), -1 signifie que le clavier n'est pas focalisable:
Il peut également être défini pour autre chose que les champs de saisie de texte, mais ce qu'il ferait là-bas n'est pas très évident, voire rien du tout. Même si la navigation fonctionne, il vaut peut-être mieux utiliser «l'ordre naturel» pour autre chose que les éléments d'entrée utilisateur très évidents.
Non, vous n'avez pas besoin de JQuery ou de script du tout pour prendre en charge ce chemin de navigation personnalisé. Vous pouvez l'implémenter côté serveur sans aucun support JavaScript. De l'autre côté, la propriété fonctionne également très bien dans le framework React mais ne l'exige pas.
la source
Voici une version plus complète de la mise au point sur l'élément suivant. Il suit les directives de spécification et trie correctement la liste des éléments en utilisant tabindex. Une variable inverse est également définie si vous souhaitez obtenir l'élément précédent.
la source
Il s'agit d'une amélioration potentielle de la grande solution proposée par @Kano et @Mx . Si vous souhaitez conserver l'ordre des TabIndex, ajoutez ce tri au milieu:
la source
Vous pouvez appeler ceci:
Languette:
Maj + Tab:
Je modifie le plug- in jquery.tabbable pour terminer.
la source
Nécromancie.
J'ai un buch de 0-tabIndexes, que je voulais naviguer au clavier.
Puisque dans ce cas, seul l'ORDRE des éléments comptait, je l'ai fait en utilisant
document.createTreeWalker
Vous créez donc d'abord le filtre (vous ne voulez que des éléments [visibles], qui ont un attribut "tabIndex" avec une valeur NUMERIQUE.
Ensuite, vous définissez le nœud racine, au-delà duquel vous ne souhaitez pas rechercher. Dans mon cas,
this.m_tree
est un élément ul contenant un arbre à bascule. Si vous voulez plutôt le document entier, remplacez-le simplementthis.m_tree
pardocument.documentElement
.Ensuite, vous définissez le nœud actuel sur l'élément actif actuel:
Ensuite, vous revenez
ni.nextNode()
ouni.previousNode()
.Remarque:
cela ne renverra PAS les onglets dans le bon ordre si vous avez tabIndices! = 0 et que l'ordre des éléments n'est PAS l'ordre tabIndex. Dans le cas de tabIndex = 0, le tabOrder est toujours l'ordre des éléments, c'est pourquoi cela fonctionne (dans ce cas).
Notez que la boucle while
n'est là que si vous le souhaitez si vous avez des critères supplémentaires que vous ne pouvez pas filtrer dans le filtre passé à createTreeWalker.
Notez qu'il s'agit de TypeScript, vous devez supprimer tous les jetons derrière les deux-points (:), et entre les crochets (<>), par exemple
<Element>
ou:(node: Node) => number
pour obtenir du JavaScript valide.Ici en tant que service, le JS transpilé:
la source
Avez-vous spécifié vos propres valeurs tabIndex pour chaque élément que vous souhaitez parcourir? si c'est le cas, vous pouvez essayer ceci:
Vous utilisez jquery, non?
la source
J'ai vérifié les solutions ci-dessus et je les ai trouvées assez longues. Cela peut être accompli avec une seule ligne de code:
ou
ici currentElement peut être n'importe quel ie document.activeElement ou ceci si l'élément courant est dans le contexte de la fonction.
J'ai suivi les événements d'onglet et de décalage de tabulation avec l'événement keydown
une fois que vous avez la direction du curseur, vous pouvez utiliser les méthodes
nextElementSibling.focus
oupreviousElementSibling.focus
la source