1642 Stimmen

Wie kann ich herausfinden, welches DOM-Element den Fokus hat?

Ich möchte in JavaScript herausfinden, welches Element gerade den Fokus hat. Ich habe das DOM durchforstet und noch nicht gefunden, was ich brauche. Gibt es eine Möglichkeit, dies zu tun, und wie?

Der Grund, warum ich das gesucht habe:

Ich versuche, Tasten wie die Pfeiltasten und enter durch eine Tabelle mit Eingabeelementen navigieren. Tab funktioniert jetzt, aber Enter und Pfeile nicht standardmäßig scheint es. Ich habe die Tastenhandhabung Teil eingerichtet, aber jetzt muss ich herausfinden, wie man den Fokus über in der Ereignisbehandlung Funktionen zu bewegen.

4 Stimmen

Hier ist ein Bookmarklet, das das Element mit dem Fokus in der console.log protokolliert: github.com/lingtalfi/wo-ist-focus-bookmarklet

1 Stimmen

Sie können verwenden find-focused-element Paket: npmjs.com/package/find-focused-element

1 Stimmen

Bei mir funktioniert das Bookmarklet nicht so, wie ich es erwähnt habe.

9voto

rplaurindo Punkte 1126

Wenn Sie ein Objekt erhalten möchten, das eine Instanz von Element müssen Sie document.activeElement , aber wenn Sie ein Objekt erhalten wollen, das eine Instanz von Text müssen Sie verwenden document.getSelection().focusNode .

Ich hoffe, das hilft.

0 Stimmen

Inwiefern besser?

0 Stimmen

Öffnen Sie den Inspektor Ihres Browsers, klicken Sie auf eine beliebige Stelle der Seite und fügen Sie diese ein document.getSelection().focusNode.parentElement und tippen Sie auf Eingabe. Danach fügen Sie document.activeElement und das Gleiche tun ;)

0 Stimmen

Mit diesem Kommentarfeld konzentriert, document.activeElement gibt die <textarea> während document.getSelection().focusNode gibt die <td> die die <textarea> (und document.getSelection().focusNode.parentElement gibt die <tr> die den <td> )

8voto

Nathan K Punkte 306

Es gibt potenzielle Probleme bei der Verwendung von document.activeElement. Bedenken Sie das:

<div contentEditable="true">
  <div>Some text</div>
  <div>Some text</div>
  <div>Some text</div>
</div>

Wenn der Benutzer den Fokus auf ein inneres DIV legt, verweist document.activeElement weiterhin auf das äußere DIV. Sie können document.activeElement nicht verwenden, um festzustellen, welches der inneren Divs den Fokus hat.

Die folgende Funktion umgeht dies und gibt den fokussierten Knoten zurück:

function active_node(){
  return window.getSelection().anchorNode;
}

Wenn Sie lieber das fokussierte Element erhalten möchten, verwenden Sie:

function active_element(){
  var anchor = window.getSelection().anchorNode;
  if(anchor.nodeType == 3){
        return anchor.parentNode;
  }else if(anchor.nodeType == 1){
        return anchor;
  }
}

3 Stimmen

Das ist nicht wirklich ein Problem mit document.activeElement : die innere <div> Elemente tatsächlich keinen Fokus erhalten können, wie Sie visuell sehen können, indem Sie die :focus Pseudoklasse zu etwas Sichtbarem (Beispiel: jsfiddle.net/4gasa1t2/1 ). Worüber Sie sprechen, ist, welche der inneren <div> s enthält die Auswahl oder das Caret, was ein separates Thema ist.

7voto

Arne Punkte 5871

Wenn Sie jQuery verwenden, können Sie damit herausfinden, ob ein Element aktiv ist:

$("input#id").is(":active");

6voto

rjmunro Punkte 25846

Wenn ich andere Antworten lese und es selbst ausprobiere, scheint es document.activeElement liefert Ihnen in den meisten Browsern das gewünschte Element.

Wenn Sie einen Browser haben, der document.activeElement nicht unterstützt, wenn Sie jQuery herum haben, sollten Sie in der Lage sein, es auf allen Fokusereignissen mit etwas sehr einfachem wie diesem zu füllen (ungetestet, da ich keinen Browser habe, der diese Kriterien zur Hand hat):

if (typeof document.activeElement === 'undefined') { // Check browser doesn't do it anyway
  $('*').live('focus', function () { // Attach to all focus events using .live()
    document.activeElement = this; // Set activeElement to the element that has been focussed
  });
}

5voto

Tony Peterson Punkte 19404

Ich stelle dies hier nur ein, um die Lösung zu nennen, auf die ich schließlich gekommen bin.

Ich habe eine Eigenschaft namens document.activeInputArea erstellt und das HotKeys-Addon von jQuery verwendet, um Tastaturereignisse für Pfeiltasten, Tabulator und Enter abzufangen, und ich habe einen Event-Handler für das Klicken in Eingabeelemente erstellt.

Dann habe ich den activeInputArea jedes Mal angepasst, wenn sich der Fokus änderte, so dass ich diese Eigenschaft verwenden konnte, um herauszufinden, wo ich mich befand.

Es ist jedoch leicht, dies zu vermasseln, denn wenn ein Fehler im System auftritt und der Fokus nicht dort ist, wo man ihn vermutet, ist es sehr schwer, den korrekten Fokus wiederherzustellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X