Ich möchte in JavaScript herausfinden, welches Element derzeit im Fokus steht. Ich habe das DOM durchgesehen und noch nicht gefunden, was ich brauche. Gibt es eine Möglichkeit, dies zu tun, und wie?
Der Grund, warum ich danach gesucht habe:
Ich versuche, Schlüssel wie die Pfeile zu erstellen und enter
durch eine Tabelle mit Eingabeelementen zu navigieren. Tab funktioniert jetzt, aber geben Sie ein, und Pfeile scheinen nicht standardmäßig zu sein. Ich habe den Schlüsselbehandlungsteil eingerichtet, aber jetzt muss ich herausfinden, wie der Fokus in den Ereignisbehandlungsfunktionen verschoben werden kann.
javascript
dom
Tony Peterson
quelle
quelle
find-focused-element
Paket verwenden: npmjs.com/package/find-focused-elementAntworten:
Verwendung
document.activeElement
, es wird in allen gängigen Browsern unterstützt.Wenn Sie zuvor herausfinden wollten, welches Formularfeld den Fokus hat, konnten Sie dies nicht. Um die Erkennung in älteren Browsern zu emulieren, fügen Sie allen Feldern einen "Fokus" -Ereignishandler hinzu und zeichnen Sie das zuletzt fokussierte Feld in einer Variablen auf. Fügen Sie einen "Unschärfe" -Handler hinzu, um die Variable bei einem Unschärfeereignis für das zuletzt fokussierte Feld zu löschen.
Wenn Sie das entfernen müssen,
activeElement
können Sie Unschärfe verwenden.document.activeElement.blur()
. Es wird die ÄnderungactiveElement
zubody
.Verwandte Links:
quelle
activeElement
gibt das fokussierte Element tatsächlich nicht zurück. Jedes Element kann fokussiert sein. Wenn ein Dokument 4 'scrolldivs' hat, kann 0 oder 1 dieser divs mit den Pfeiltasten gescrollt werden. Wenn Sie auf eine klicken, wird diese Div fokussiert. Wenn Sie außerhalb von allen klicken, ist der Körper fokussiert. Wie finden Sie heraus, welches scrolldiv fokussiert ist? jsfiddle.net/rudiedirkx/bC5ke/show (Konsole überprüfen)div
Firefox 17 ist, und zwar nur durch Tippen darauf. Die Arten von Elementen , die alle gängigen Browser über das Rückdocument.activeElement
sind beschränkt auf Eingabeelemente -bezogene. Wenn kein solches Element den Fokus hat, geben alle gängigen Browser dasbody
Element zurück - mit Ausnahme von IE 9, das dashtml
Element zurückgibt .document.activeElement
sollte in einetry catch
Datei eingeschlossen werden, da dies unter bestimmten Umständen eine Ausnahme auslösen kann (nicht nur IE9 AFAIK). Siehe bugs.jquery.com/ticket/13393 und bugs.jqueryui.com/ticket/8443Wie von JW gesagt, können Sie das aktuell fokussierte Element zumindest browserunabhängig nicht finden. Wenn Ihre App jedoch nur IE ist (einige sind ...), können Sie sie folgendermaßen finden:
BEARBEITEN: Es sieht so aus, als ob der IE doch nicht alles falsch gemacht hat. Dies ist Teil des HTML5-Entwurfs und scheint zumindest von der neuesten Version von Chrome, Safari und Firefox unterstützt zu werden.
quelle
Wenn Sie jQuery verwenden können, unterstützt es jetzt: focus, stellen Sie einfach sicher, dass Sie Version 1.6+ verwenden.
Mit dieser Anweisung erhalten Sie das aktuell fokussierte Element.
Von: So wählen Sie mit jQuery ein Element aus, auf das der Fokus liegt
quelle
return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
document.activeElement
ist jetzt Teil der HTML5-Entwurfsspezifikation , wird jedoch in einigen nicht wichtigen / mobilen / älteren Browsern möglicherweise noch nicht unterstützt. Sie können auf zurückgreifenquerySelector
(wenn dies unterstützt wird). Erwähnenswert ist auch, dass dies zurückgegebendocument.activeElement
wird,document.body
wenn kein Element fokussiert ist - auch wenn das Browserfenster keinen Fokus hat.Der folgende Code umgeht dieses Problem und
querySelector
bietet eine etwas bessere Unterstützung.Zu beachten ist außerdem der Leistungsunterschied zwischen diesen beiden Methoden. Das Abfragen des Dokuments mit Selektoren ist immer viel langsamer als der Zugriff auf die
activeElement
Eigenschaft. Siehe diesen jsperf.com-Test .quelle
An sich
document.activeElement
kann immer noch ein Element zurück , wenn das Dokument nicht fokussiert ist (und damit nichts mehr im Dokument konzentriert sich!)Sie können dieses Verhalten wollen, oder es kann nicht Sache (zB innerhalb eines
keydown
Ereignisses), aber wenn Sie etwas wissen müssen , ist tatsächlich konzentriert, können Sie zusätzlich prüfendocument.hasFocus()
.Das Folgende gibt Ihnen das fokussierte Element, falls es eines gibt, oder sonst
null
.Um zu überprüfen, ob ein bestimmtes Element den Fokus hat, ist es einfacher:
Um zu überprüfen, ob etwas fokussiert ist, ist es wieder komplexer:
Hinweis zur Robustheit : In dem Code, in dem gegen
document.body
und geprüft wirddocument.documentElement
, liegt dies daran, dass einige Browser einen dieser Codes zurückgeben odernull
wenn nichts fokussiert ist.Es wird nicht berücksichtigt, ob das
<body>
(oder vielleicht<html>
) eintabIndex
Attribut hatte und somit tatsächlich fokussiert werden könnte . Wenn Sie eine Bibliothek oder etwas anderes schreiben und möchten, dass es robust ist, sollten Sie das wahrscheinlich irgendwie handhaben.Hier ist eine ( schwere Airquotes) "Einzeiler" -Version des Erhaltens des fokussierten Elements, die konzeptionell komplizierter ist, weil Sie über Kurzschlüsse Bescheid wissen müssen, und Sie wissen, dass es offensichtlich nicht in eine Zeile passt, vorausgesetzt, Sie möchte, dass es lesbar ist.
Ich werde diesen nicht empfehlen. Aber wenn Sie ein 1337 hax0r sind, Idk ... ist es da.
Sie können das
|| null
Teil auch entfernen, wenn Siefalse
in einigen Fällen nichts dagegen haben. (Sie könnten immer noch bekommen,null
wenn esdocument.activeElement
istnull
):Wenn ein bestimmtes Element zur Überprüfung fokussiert ist, alternativ Sie können Ereignisse verwenden, aber auf diese Weise erfordert Setup (und möglicherweise Teardown) und wichtiger ist , übernimmt ein Anfangszustand :
Sie können die Annahme des Anfangszustands auf nicht ereignisgesteuerte Weise korrigieren, aber Sie können dies auch verwenden.
quelle
document.activeElement
kann standardmäßig das<body>
Element verwenden, wenn keine fokussierbaren Elemente im Fokus sind. Wenn ein Element fokussiert ist und das Browserfenster unscharf ist,activeElement
wird das fokussierte Element weiterhin beibehalten.Wenn eines dieser beiden Verhaltensweisen nicht wünschenswert ist, ziehen Sie einen CSS-basierten Ansatz in Betracht :
document.querySelector( ':focus' )
.quelle
querySelector
: stackoverflow.com/a/40873560/2624876Ich mochte den Ansatz von Joel S, aber ich liebe auch die Einfachheit von
document.activeElement
. Ich habe jQuery verwendet und beide kombiniert. Ältere Browser nicht unterstützen ,document.activeElement
wird verwenden SiejQuery.data()
den Wert von ‚hasFocus‘ zu speichern. Neuere Browser werden verwendetdocument.activeElement
. Ich gehe davon aus, dass diesdocument.activeElement
eine bessere Leistung bringen wird.quelle
$("*:focus")
?Ein kleiner Helfer, den ich in Mootools für diese Zwecke verwendet habe:
Auf diese Weise können Sie überprüfen, ob das Element den Fokus hat,
el.hasFocus()
sofernstartFocusTracking()
dies für das angegebene Element aufgerufen wurde.quelle
JQuery unterstützt die
:focus
Pseudoklasse ab dem aktuellen Stand. Wenn Sie in der JQuery-Dokumentation danach suchen, überprüfen Sie unter "Selektoren", wo Sie auf die W3C-CSS-Dokumente verweisen . Ich habe mit Chrome, FF und IE 7+ getestet. Beachten Sie, dass es<!DOCTYPE...
auf der HTML-Seite vorhanden sein muss , damit es im IE funktioniert . In diesem Beispiel wird davon ausgegangen, dass Sie dem fokussierten Element eine ID zugewiesen haben:quelle
this.id
Anstelle von$(this).attr('id')
oder zumindest (wenn Sie Ihr jQuery-Objekt bereits haben) verwenden$(this)[0].id
. Native Javascript auf dieser Ebene ist viel schneller und effizienter. Ist in diesem Fall möglicherweise nicht erkennbar, aber systemweit werden Sie einen Unterschied feststellen.Wenn Sie ein Objekt erhalten möchten, das eine Instanz von ist
Element
, müssen Sie es verwendendocument.activeElement
. Wenn Sie jedoch ein Objekt erhalten möchten, das eine Instanz von istText
, müssen Sie es verwendendocument.getSelection().focusNode
.Ich hoffe es hilft.
quelle
document.getSelection().focusNode.parentElement
tippen Sie darauf und tippen Sie auf die Eingabetaste. Danach vorbeidocument.activeElement
und mach es gleich. ;)document.activeElement
<textarea>
document.getSelection().focusNode
<td>
<textarea>
document.getSelection().focusNode.parentElement
<tr>
<td>
Element
, müssen Sie es verwendendocument.activeElement
. Wenn Sie jedoch ein Objekt erhalten möchten, das eine Instanz von istText
, müssen Sie es verwendendocument.getSelection().focusNode
. Bitte testen Sie es erneut. Ich hoffe ich habe geholfen.focusNode
ist garantiert auch kein Textknoten.Es gibt potenzielle Probleme bei der Verwendung von document.activeElement. Erwägen:
Wenn sich der Benutzer auf ein inneres Div konzentriert, verweist document.activeElement weiterhin auf das äußere Div. Sie können document.activeElement nicht verwenden, um zu bestimmen, welcher der inneren Divs den Fokus hat.
Die folgende Funktion umgeht dies und gibt den fokussierten Knoten zurück:
Wenn Sie lieber das fokussierte Element erhalten möchten, verwenden Sie:
quelle
document.activeElement
: Die inneren<div>
Elemente können tatsächlich keinen Fokus erhalten, wie Sie visuell sehen können, indem Sie die Pseudoklasse:focus
auf etwas Sichtbares setzen (Beispiel: jsfiddle.net/4gasa1t2/1 ). Sie sprechen davon, welches der inneren<div>
s die Auswahl oder das Caret enthält, was ein separates Thema ist.Ich habe festgestellt, dass das folgende Snippet nützlich ist, um festzustellen, welches Element derzeit den Fokus hat. Kopieren Sie Folgendes in die Konsole Ihres Browsers und drucken Sie jede Sekunde die Details des aktuellen Elements aus, das den Fokus hat.
Sie können das ändern
console.log
, um etwas anderes abzumelden, damit Sie das genaue Element genau bestimmen können, wenn das Ausdrucken des gesamten Elements Ihnen nicht hilft, das Element genau zu bestimmen.quelle
Es scheint, andere Antworten zu lesen und mich selbst zu versuchen
document.activeElement
das Element, das Sie in den meisten Browsern benötigen.Wenn Sie einen Browser haben, der document.activeElement nicht unterstützt, wenn Sie über jQuery verfügen, sollten Sie in der Lage sein, ihn bei allen Fokusereignissen mit etwas sehr Einfachem wie diesem zu füllen (ungetestet, da ich keinen Browser habe, der diese Kriterien erfüllt ):
quelle
Wenn Sie jQuery verwenden, können Sie damit herausfinden, ob ein Element aktiv ist:
quelle
Mit dojo können Sie dijit.getFocus () verwenden
quelle
Setzen Sie dies hier ein, um die Lösung zu finden, die ich schließlich gefunden habe.
Ich habe eine Eigenschaft namens document.activeInputArea erstellt und das HotKeys-Addon von jQuery verwendet, um Tastaturereignisse für Pfeiltasten, Tabulatoren und Eingaben abzufangen, und einen Ereignishandler zum Klicken in Eingabeelemente erstellt.
Dann habe ich die activeInputArea jedes Mal angepasst, wenn sich der Fokus geändert hat, damit ich diese Eigenschaft verwenden kann, um herauszufinden, wo ich mich befinde.
Es ist jedoch einfach, dies zu vermasseln, denn wenn Sie einen Fehler im System haben und der Fokus nicht dort liegt, wo Sie denken, ist es sehr schwierig, den richtigen Fokus wiederherzustellen.
quelle