Ich versuche, den Fokus auf das nächste Element in der Registerkartenfolge zu verschieben, basierend auf dem aktuellen Element, das den Fokus hat. Bisher habe ich bei meinen Suchen nichts gefunden.
function OnFocusOut()
{
var currentElement = $get(currentElementId); // ID set by OnFocusIn
currentElementId = "";
currentElement.nextElementByTabIndex.focus();
}
Natürlich ist der nextElementByTabIndex der Schlüssel, damit dies funktioniert. Wie finde ich das nächste Element in der Tabulatorsequenz? Die Lösung müsste auf JScript basieren und nicht auf JQuery.
javascript
jscript.net
JadziaMD
quelle
quelle
currentElementId = "";
?input
,button
undtextarea
Tags und ignorierentabindex
Attribut“..newElementByTabIndex
Code sehen, weil das nicht funktioniert.focus()
Methode vorhanden ist.Antworten:
Ohne Abfrage: Fügen Sie zunächst Ihre tabulatorfähigen Elemente hinzu
class="tabable"
, damit wir sie später auswählen können. (Vergessen Sie nicht das Präfix der Klassenauswahl "." Im folgenden Code.)quelle
var tabbables = document.getElementsByName("tabable");
durch ersetzenvar tabbables = document.getElementsByTagName("input");
var tabbables = document.querySelectorAll("input, textarea, button")
// IE8 +, erhalte einen Verweis auf alle Tabellen, ohne deinen HTML-Code zu ändern.Ich habe dies nie implementiert, aber ich habe ein ähnliches Problem untersucht, und hier ist, was ich versuchen würde.
Versuchen Sie dies zuerst
Zuerst würde ich sehen, ob Sie einfach ein
keypress
Ereignis für die Tabulatortaste auf das Element auslösen könnten , das derzeit den Fokus hat. Es kann verschiedene Möglichkeiten geben, dies für verschiedene Browser zu tun.Wenn das nicht funktioniert, müssen Sie härter arbeiten ...
Wenn Sie auf die jQuery-Implementierung verweisen, müssen Sie:
1. Achten Sie auf Tab und Umschalt + Tab
Das Abhören von Tab und Shift + Tab wird wahrscheinlich an anderer Stelle im Web gut behandelt, daher überspringe ich diesen Teil.
2. Wissen, welche Elemente tabulatorfähig sind
Zu wissen, welche Elemente tabulatorfähig sind, ist schwieriger. Grundsätzlich ist ein Element tabulatorfähig, wenn es fokussierbar ist und das Attribut nicht
tabindex="-1"
festgelegt ist. Dann müssen wir uns fragen, welche Elemente fokussierbar sind. Die folgenden Elemente sind fokussierbar:input
,select
,textarea
,button
, Undobject
Elemente , die nicht deaktiviert werden.a
undarea
Elemente, die einenhref
oder einen numerischen Wert fürtabindex
set haben.tabindex
set hat.Darüber hinaus ist ein Element nur fokussierbar, wenn:
display: none
.visibility
istvisible
. Dies bedeutet, dass der nächste zu setzende Vorfahrvisibility
einen Wert von haben mussvisible
. Wenn kein Vorfahrvisibility
festgelegt wurde, lautet der berechnete Wertvisible
.Weitere Details finden Sie in einer anderen Antwort zum Stapelüberlauf .
3. Verstehen Sie, wie die Tab-Reihenfolge funktioniert
Die Tabulatorreihenfolge der Elemente in einem Dokument wird durch das
tabindex
Attribut gesteuert . Wenn kein Wert eingestellt ist,tabindex
ist das effektiv0
.Die
tabindex
Reihenfolge für das Dokument lautet: 1, 2, 3,…, 0.Wenn das
body
Element (oder kein Element) den Fokus hat, ist das erste Element in der Registerkartenreihenfolge zunächst das niedrigste ungleich Nulltabindex
. Wenn mehrere Elemente dasselbe habentabindex
, gehen Sie in Dokumentreihenfolge, bis Sie damit das letzte Element erreichentabindex
. Dann bewegen Sie sich zum nächstniedrigerentabindex
und der Prozess wird fortgesetzt. Beenden Sie schließlich mit diesen Elementen mit einer Null (oder leer)tabindex
.quelle
Hier ist etwas, das ich für diesen Zweck baue:
Eigenschaften:
quelle
nextElementSibling
möglicherweise nicht fokussierbar, das nächste fokussierbar ist möglicherweise kein Geschwister.hidden
und auchtextarea
und abdecktselect
.Ich habe ein einfaches jQuery-Plugin erstellt, das genau dies tut. Es verwendet den Selektor ': tabbable' der jQuery-Benutzeroberfläche, um das nächste 'tabbable'-Element zu finden und auszuwählen.
Anwendungsbeispiel:
quelle
Der Kern der Antwort liegt darin, das nächste Element zu finden:
Verwendung:
Beachten Sie, dass mir das Priorisieren egal ist
tabIndex
.quelle
Wie in einem Kommentar oben erwähnt, glaube ich nicht, dass Browser Informationen zur Tab-Reihenfolge anzeigen. Hier eine vereinfachte Annäherung an das, was der Browser tut, um das nächste Element in Tabulatorreihenfolge zu erhalten:
Dies berücksichtigt nur einige Tags und ignoriert
tabindex
Attribute, kann jedoch ausreichen, je nachdem, was Sie erreichen möchten.quelle
Es scheint, dass Sie die
tabIndex
Eigenschaft eines Elements überprüfen können, um festzustellen, ob es fokussierbar ist. Ein Element, das nicht fokussierbar ist, hat eintabindex
"-1".Dann müssen Sie nur noch die Regeln für Tabulatoren kennen:
tabIndex="1"
hat die höchste Priorität.tabIndex="2"
hat die nächsthöhere Priorität.tabIndex="3"
ist als nächstes und so weiter.tabIndex="0"
(oder standardmäßig tabellierbar) hat die niedrigste Priorität.tabIndex="-1"
(oder standardmäßig nicht tabellierbar) fungiert nicht als Tabulator.Hier ist ein Beispiel, wie Sie die Liste der Tabulatoren nacheinander mit reinem Javascript erstellen:
Wir gehen zuerst durch das DOM und sammeln alle Tabstopps nacheinander mit ihrem Index. Wir stellen dann die endgültige Liste zusammen. Beachten Sie, dass wir die Elemente mit ganz
tabIndex="0"
am Ende der Liste nach den Elementen mit einemtabIndex
von 1, 2, 3 usw. hinzufügen .Ein voll funktionsfähiges Beispiel, in dem Sie mit der Eingabetaste herumblättern können, finden Sie in dieser Geige .
quelle
Tabbable ist ein kleines JS-Paket, mit dem Sie eine Liste aller tabellarischen Elemente in Tab-Reihenfolge erhalten . So können Sie Ihr Element in dieser Liste finden und sich dann auf den nächsten Listeneintrag konzentrieren.
Das Paket behandelt die komplizierten Randfälle, die in anderen Antworten erwähnt werden, korrekt (z. B. kann kein Vorfahr sein
display: none
). Und es kommt nicht auf jQuery an!Zum jetzigen Zeitpunkt (Version 1.1.1) gibt es die Einschränkungen, dass IE8 nicht unterstützt wird und dass Browserfehler die
contenteditable
korrekte Behandlung verhindern .quelle
quelle
Dies ist mein erster Beitrag zu SO, daher habe ich nicht genug Ruf, um die akzeptierte Antwort zu kommentieren, aber ich musste den Code wie folgt ändern:
Der Wechsel von var zu konstant ist unkritisch. Die Hauptänderung ist, dass wir den Selektor loswerden, der tabindex überprüft! = "-1". Wenn das Element später das Attribut tabindex hat UND auf "-1" gesetzt ist, halten wir es NICHT für fokussierbar.
Der Grund, warum ich dies ändern musste, war
<input>
, dass dieses Element beim Hinzufügen von tabindex = "- 1" zu einem Element immer noch als fokussierbar angesehen wurde, da es mit dem Selektor "input [type = text]: not ([disabled])" übereinstimmt. Meine Änderung entspricht "Wenn wir eine nicht deaktivierte Texteingabe sind und ein tabIndex-Attribut haben und der Wert dieses Attributs -1 ist, sollten wir nicht als fokussierbar betrachtet werden.Ich glaube, als der Autor der akzeptierten Antwort seine Antwort bearbeitet hat, um das tabIndex-Attribut zu berücksichtigen, hat er dies nicht richtig gemacht. Bitte lassen Sie mich wissen, wenn dies nicht der Fall ist
quelle
Es gibt die tabindex- Eigenschaft, die für die Komponente festgelegt werden kann. Es gibt an, in welcher Reihenfolge die Eingabekomponenten iteriert werden sollen, wenn Sie eine auswählen und die Tabulatortaste drücken. Werte über 0 sind für die benutzerdefinierte Navigation reserviert, 0 ist "in natürlicher Reihenfolge" (würde sich also anders verhalten, wenn es für das erste Element festgelegt wird), -1 bedeutet, dass die Tastatur nicht fokussierbar ist:
Es kann auch für etwas anderes als die Texteingabefelder eingestellt werden, aber es ist nicht sehr offensichtlich, was es dort tun würde, wenn überhaupt. Selbst wenn die Navigation funktioniert, ist es vielleicht besser, "natürliche Reihenfolge" für etwas anderes als die sehr offensichtlichen Benutzereingabeelemente zu verwenden.
Nein, Sie benötigen weder JQuery noch Skripte, um diesen benutzerdefinierten Navigationspfad zu unterstützen. Sie können es auf der Serverseite ohne JavaScript-Unterstützung implementieren. Auf der anderen Seite funktioniert die Eigenschaft auch im React-Framework einwandfrei, erfordert sie jedoch nicht.
quelle
Hier ist eine vollständigere Version der Fokussierung auf das nächste Element. Es folgt den Spezifikationsrichtlinien und sortiert die Liste der Elemente mithilfe von tabindex korrekt. Es wird auch eine umgekehrte Variable definiert, wenn Sie das vorherige Element erhalten möchten.
quelle
Dies ist eine potenzielle Verbesserung der großartigen Lösung, die @Kano und @Mx angeboten haben. Wenn Sie die TabIndex-Reihenfolge beibehalten möchten, fügen Sie diese Sortierung in der Mitte hinzu:
quelle
Sie können dies nennen:
Tab:
Umschalt + Tab:
Ich ändere jquery.tabbable PlugIn, um abzuschließen.
quelle
Nekromantie.
Ich habe eine Menge 0-tabIndexes, die ich über die Tastatur navigieren wollte.
Da in diesem Fall nur die BESTELLUNG der Elemente von Bedeutung war, habe ich es mit verwendet
document.createTreeWalker
Zuerst erstellen Sie den Filter (Sie möchten nur [sichtbare] Elemente, die ein Attribut "tabIndex" mit einem NUMERICAL-Wert haben.
Dann legen Sie den Wurzelknoten fest, über den hinaus Sie nicht suchen möchten. In meinem Fall
this.m_tree
ist ein ul-Element, das einen toggable Baum enthält. Wenn Sie das gesamte Dokument stattdessen möchten, ersetzen Sie einfachthis.m_tree
mitdocument.documentElement
.Dann setzen Sie den aktuellen Knoten auf das aktuell aktive Element:
Dann kehren Sie zurück
ni.nextNode()
oderni.previousNode()
.Hinweis:
Dadurch werden die Registerkarten NICHT in der richtigen Reihenfolge zurückgegeben, wenn Sie tabIndices! = 0 haben und die Elementreihenfolge NICHT die tabIndex-Reihenfolge ist. Bei tabIndex = 0 ist tabOrder immer die Elementreihenfolge, weshalb dies (in diesem Fall) funktioniert.
Beachten Sie, dass die while-Schleife
ist nur verfügbar, wenn Sie zusätzliche Kriterien haben, die Sie in dem an createTreeWalker übergebenen Filter nicht filtern können.
Beachten Sie, dass dies TypeScript ist. Sie müssen alle Token hinter Doppelpunkten (:) und zwischen spitzen Klammern (<>) entfernen, z. B.
<Element>
oder:(node: Node) => number
um gültiges JavaScript zu erhalten.Hier als Service, die transpilierte JS:
quelle
Haben Sie für jedes Element, das Sie durchlaufen möchten, Ihre eigenen tabIndex-Werte angegeben? Wenn ja, können Sie Folgendes versuchen:
Sie verwenden jquery, richtig?
quelle
Ich habe die obigen Lösungen überprüft und fand sie ziemlich langwierig. Dies kann mit nur einer Codezeile erreicht werden:
oder
Hier kann currentElement ein beliebiges Dokument sein, dh document.activeElement oder dies, wenn sich das aktuelle Element im Funktionskontext befindet.
Ich habe Tab- und Shift-Tab-Ereignisse mit dem Keydown-Ereignis verfolgt
Sobald Sie die Cursorrichtung haben, können Sie
nextElementSibling.focus
oderpreviousElementSibling.focus
Methoden verwendenquelle