Я провел некоторые исследования и тестирование, и вот проблема:
Коды Space
/ Enter
keydown
заменяются событием click
программой чтения с экрана в режиме Browse
.
У NVDA такая же проблема открыта здесь .
В вашем случае, я бы сказал, что это может быть легко обойти, выбрав первый вариант для всех применимых событий, как это:
handleOpenOptions = event => {
switch (event.type) {
case "click":
this._handleOpenOptions(event);
break;
case "keydown":
if (event.key === "Enter" || event.key === " ") {
this._handleOpenOptions(event);
}
break;
default:
}
};
_handleOpenOptions = event => {
this.setState(
() => {
return {
openOptions: !this.state.openOptions,
focusedOption: document.activeElement.id
};
},
() => {
this.arrayOfOptionsRefs[0].focus();
}
);
};
Так что это будет работать как с / без чтения с экрана.
Другой вариант - заставить вашу страницу использовать роль application
:
Вы можете использовать role = "application", чтобы принудительно отключить использование режима просмотра, но это будет означать, что пользователь не сможет использовать режим просмотра.
в этом случае события должны обрабатываться по мере их возникновения.