Machen Sie ein HTML-Element nicht fokussierbar

75

Ist es möglich, ein HTML-Element nicht fokussierbar zu machen ?

Ich verstehe, dass eine Liste von Elementen definiert werden kann, die den Fokus erhalten können, und dass ein Benutzer durch Drücken einer TabTaste durch diese Elemente navigieren kann . Ich sehe auch, dass es an dem Browser liegt, dies zu kontrollieren.

Aber vielleicht gibt es eine Möglichkeit, bestimmte Elemente nicht fokussierbar zu machen. Angenommen, ich möchte, dass ein Benutzer ein bestimmtes <a>Tag überspringt, wenn er a drückt Tab.

Alvis
quelle
Mögliches Duplikat, wie man einen DIV unscharf macht?
thSoft
Die Frage ist falsch formuliert. Es sollte lauten: "Wie kann man ein HTML-Element nicht tabellierbar machen?" Das ist es, was das Originalplakat will.
ShortFuse

Antworten:

106
<a href="http://foo.bar" tabindex="-1">unfocusable</a>

Ein negativer Wert bedeutet, dass das Element fokussierbar sein sollte, aber nicht über die sequentielle Tastaturnavigation erreichbar sein sollte.

Siehe auch: developer.mozilla.org

Fedor Skrynnikov
quelle
1
Denken Sie daran, dass es ungültiges HTML ist, eine Zahl unter 0 als Wert von zu haben tabindex(obwohl ich denke, dass es in HTML5 gültig ist).
James Allardice
53
Beachten Sie, dass ein Element mit einem negativen Tabindex weiterhin fokussierbar ist. Es kann nur nicht mit der sequentiellen Fokusnavigation (dh Tabulator) erreicht werden.
Alohci
Dies funktioniert im IE für bestimmte Elemente (z. B. SVG-Knoten) nicht. Eine Lösung finden Sie in Zohids Antwort unten.
Jenny O'Reilly
1
Nur eine Randnotiz für React-Entwickler: Vergessen Sie nicht den camelCase und die Klammern: tabIndex = {- 1}
e18r
26

Um den Fokus nicht nur bei Verwendung der tabSchaltfläche vollständig zu verhindern , legen Sie ihn disabledals Attribut in Ihrem HTML-Element fest.

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<input class="form-control" type="text"> Click this, you can see it's focusable.

<input class="form-control" type="text" readonly>  Click this, you can see it's focusable.

<input class="form-control" type="text" readonly tabindex="-1">  Click this, you can see it's focusable. Not tab'able.

<input class="form-control" type="text" disabled>  Click this, you can see it's <strong>not</strong> focusable.

Geil
quelle
3
Dies ist nicht das, was das OP erreichen will. Ihr Beispiel würde dieses Textfeld deaktivieren. Ein deaktiviertes Textfeld ist nicht dasselbe wie ein nicht fokussierbares. Er möchte weiterhin, dass seine Schaltfläche anklickbar ist, möchte jedoch, dass sein Textfeld weiterhin den Fokus hat, während er auf seine Schaltfläche klickt. Wenn ein Objekt nicht fokussierbar ist, bedeutet die Interaktion mit ihm durch Klicken auf usw., dass das aktuell fokussierte Objekt fokussiert bleibt. Das will das OP erreichen.
Richard
@ Richard Ich habe Beispiele gegeben, wie man ein Element unscharf macht. Es ist Sache des Einsatzes, zu entscheiden, ob er die Antwort akzeptiert. Was Sie beschreiben, ist in der HTML-Spezifikation nicht möglich. Das Abstimmen meiner Antwort tut mir weh, da die Antwort keine schlechte Antwort ist und vielen Menschen geholfen hat, wenn man sich die positiven Stimmen ansieht. Ich würde es vorziehen, wenn Sie einfach falsche Antworten ablehnen, anstatt meine Antwort, die die bestmögliche Lösung zeigt. Die Antwort, die das OP akzeptiert hat, ist gemäß Ihrer Beschreibung ebenfalls falsch. Bitte lesen Sie die Tour und denken Sie noch einmal über die Abstimmung nach.
Randy
Dies funktioniert nicht für Nicht- inputElemente - wenn ich nicht möchte, dass ein <div>Fokus erhalten kann, disabledhilft das nicht.
Coderer
7

Um zu verhindern, dass ein Element den Fokus erhält ("nicht fokussierbar"), müssen Sie Javascript verwenden, focusum die Standardinteraktion zu überwachen und zu verhindern.

Verwenden Sie tabindex=-1Attribut, um zu verhindern, dass ein Element mit Registerkarten versehen wird.

Durch Hinzufügen tabindex=-1wird jedes Element fokussierbar, auch divElemente. Das heißt, wenn ein Benutzer darauf klickt, erhält er je nach Browser wahrscheinlich eine Fokusübersicht.

Idealerweise möchten Sie Folgendes:

function preventFocus(event) {
  event.preventDefault();
  if (event.relatedTarget) {
    // Revert focus back to previous blurring element
    event.relatedTarget.focus();
  } else {
    // No previous focus target, blur instead
    event.currentTarget.blur();
  }
}

/* ... */

element.setAttribute('tabindex', '-1');
element.addEventListener('focus', preventFocus);
ShortFuse
quelle
Leider macht dies auf einem Schieberegler (<input type = "range") das Verhalten des Schiebereglers sehr unangenehm: Klicken funktioniert immer noch, aber nicht ziehen.
Arnaud
4

Ich habe verwendet focusable="false", weil tabindex="-1"nicht im IE gearbeitet hat.

Zohid
quelle
1
Dies scheint ein nicht standardmäßiges Attribut zu sein, das vom IE für SVG-Elemente verwendet wird: msdn.microsoft.com/en-us/ie/ff971943(v=vs.94)
Jenny O'Reilly
1

Für das Element, auf das Sie sich nicht konzentrieren möchten, müssen Sie den Tabindex als negativen Wert eingeben.

r3st0r3
quelle
0

Ohne JavaScript ist es nicht möglich, ein standardmäßig fokussierbares HTML-Element nicht fokussierbar zu machen.

Nachdem ich mich mit fokusbezogenen DOM-Ereignissen befasst habe, habe ich die folgende Implementierung entwickelt (basierend auf der Antwort von @ ShortFuse , aber einige Probleme und Randfälle behoben):

    // A focus event handler to prevent focusing an element it attached to
    onFocus(event: FocusEvent): void {
        event.preventDefault();

        // Try to remove the focus from this element.
        // This is important to always perform, since just focusing the previously focused element won't work in Edge/FF, if that element is unable to actually get the focus back (became invisible, etc.): the focus would stay on the current element in such a case
        const currentTarget: any | null = event.currentTarget;
        if (currentTarget !== null && isFunction(currentTarget.blur))
            currentTarget.blur();

        // Try to set focus back to the previous element
        const relatedTarget: any | null = event.relatedTarget;
        if (relatedTarget !== null && isFunction(relatedTarget.focus))
            relatedTarget.focus();
    }

   // Not the best implementation, but works for the majority of the real-world cases
    export function isFunction(value: any): value is Function {
        return value instanceof Function;
    }

Dies ist in TypeScript implementiert, kann jedoch leicht für einfaches JavaScript angepasst werden.

Alexander Abakumov
quelle
-3

Ich habe gerade den YouTube-Quellcode gelesen. Ich sehe focusable = "false".

<svg xmlns="https://www.w3.org/2000/svg" focusable="false" aria-label="" fill="#4285F4" viewBox="0 0 24 24" height="24" width="24" style="margin-left: 4px; margin-top: 4px;"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path></svg>

Ist das eine richtigere Antwort?

Spencer Haley
quelle
Wenn Sie IE und auf SVG-Element verwenden ... sicher, warum nicht.
Fedor Skrynnikov
Es ist spezifisch für das <svg> -Element? Wo finde ich diese Informationen? Vielen Dank!
Spencer Haley