Ich habe einen einfachen Codeabschnitt, den ich versuche, Tastatur zugänglich zu machen, während Sie den NVDA Bildschirmleser verwenden.NVDA Bildschirmleser nicht vorhersagbar in den Fokusmodus wechseln
Konkret habe ich ein div mit einer Rolle von "button", mit einem anderen div mit einer anderen Rolle von "button" darin verschachtelt. Jedes div hat ein anderes onkeydown-Ereignis, das ausgelöst wird, wenn der Benutzer auf dieses div zugreift, und drückt "enter".
Diese Tastaturfunktion funktioniert wie gewünscht, wenn der NVDA Bildschirmleser nicht eingeschaltet ist.
Wenn ich den Bildschirmleser jedoch eingeschaltet habe, wird das verschachtelte Keydown-Ereignis nicht mehr ausgelöst. Stattdessen wird nur das übergeordnete Ereignis ausgelöst, auch wenn das verschachtelte Ereignis ein Fokus hat.
Wenn ich NVDA jedoch manuell aus dem "Browse-Modus" in den "Fokusmodus" (durch Drücken der NVDA-Taste + Leertaste) ändere, funktionieren die Tastenereignisse wieder wie gewünscht.
Leider kann ich nicht erwarten, dass jemand, der NVDA benutzt, weiß, dass er manuell in den "Fokusmodus" schaltet. Es muss entweder automatisch in den "Fokusmodus" wechseln oder es muss im "Browse-Modus" arbeiten.
Hier ist der Code:
HTML:
<div role="button"
tabindex="1"
onkeydown="keyEvent(event, outerDivAction)"
class="outerDiv">
Outer Div
<div role="button"
tabindex="1"
onkeydown="keyEvent(event, innerDivAction)"
class="innderDiv">
Inner Div</div>
</div>
<div class="result"></div>
JavaScript:
function outerDivAction(event) {
event.stopPropagation();
console.log('outer div');
$('.result').html('<p>outer div!</p>');
}
function innerDivAction(event) {
event.stopPropagation();
console.log('inner div')
$('.result').html('<p>inner div!</p>');
}
function keyEvent(event, callback) {
event.stopPropagation();
if (event.which === 13) {
callback(event);
}
}
$('.outerDiv').click(outerDivAction);
$('.innderDiv').click(innerDivAction);
Sie auch hier ein codepen betrachten: http://codepen.io/jennEDVT/pen/Yprova
Jede Hilfe, dass jemand würde anbieten sehr geschätzt werden!
p.s. Ich weiß, wenn ich das verschachtelte div nehme und es so verschiebe, dass es nicht mehr verschachtelt ist, sondern eher ein Geschwister des ersten div ist, dann funktioniert alles wie gewünscht. Leider ist das keine Option. Das Div muss verschachtelt sein.
Vielen Dank, dass Sie sich die Zeit genommen haben, eine solch umfassende Erklärung zu geben. Leider wird dies schwierig zu implementieren sein, da die eigentliche Spezifikation, die ich entwickle, eine Navigation mit einigen Elementen ist, denen Dropdown-Menüs zugeordnet sind, und dann haben die Dropdown-Elemente ein zusätzliches Untermenü, das als Flyout-Menü angezeigt wird. Und jedes dieser Elemente kann manchmal Schaltflächen (die ein Untermenü öffnen) oder Links sein, und so verwende ich derzeit JavaScript, um sie dynamisch von role = "button" zu role = "link" zu ändern. Der Grund für die Verschachtelung der Elemente liegt darin, dass die Untermenüs untergeordnete Elemente sind. – jennEDVT
Um die Verschachtelung von Schaltflächen zu vermeiden, könnten Sie Ihren Code so umstrukturieren, dass er eine Liste mit verschachtelten Unterlisten (die Schaltflächen enthalten) verwendet? Es erfordert etwas mehr Aufwand, um die Sichtbarkeit basierend auf dem Fokus der Listenelemente (oder Schaltflächenumschaltung) zu steuern, aber es vermeidet den verschachtelten interaktiven Inhalt, den @aardrian erwähnt hat. Hier ist ein Codepen, um zu illustrieren, was ich meine: http://codepen.io/anon/pen/KNyZYm – Skerrvy
@jennEDVT, Sie haben möglicherweise keine andere Wahl als zu refactor, da Sie immer auf Probleme mit assistiver Technologie stoßen werden. Skerrvy hat eine gute schnelle Demo von dem, was du ausprobieren kannst. Suchen Sie auch nach vorhandenen Mustern, die Sie ändern können. Zum Beispiel hat Adobe ein komplexes Mega-Menü, das zwar zu viel für die meisten Websites ist, aber vielleicht passt? http://adobe-accessibility.github.io/Accessible-Mega-Menu/ – aardrian