![](/img/trans.png)
[英]a11y & angularjs - windows screen reader overrides keydown event
[英]Keypress event handler for a11y compliance
我正在尝试使我的工作 React.JS 应用程序符合可访问性标准。
作为练习的一部分,我在使用onClick
处理程序的地方添加了onKeyDown
处理程序。 我还使用一个特殊的包装器 function 来包装这些处理程序,该包装器检查按下了哪个键。 实际代码如下:
import { KeyboardEvent } from 'react';
enum Keys {
TAB = 9,
}
const handleKeyPress = (cb: () => void) => (e: KeyboardEvent) => {
if (e.keyCode !== Keys.TAB) cb();
};
export { handleKeyPress };
我将其用作:
<div
className={classes.link_complete}
onClick={handleOnClick}
onKeyDown={handleKeyPress(() => {
handleOnClick();
})}
tabIndex={0}
role="button"
>
这工作正常。 但是,在某些情况下,我想将实际事件作为参数传递给由handleKeyPress
function 包装的 function。 那对我不起作用。 我试过了:
onClick={handleViewInfoClick}
onKeyDown={(e) => {
console.log('detected keydown');
handleKeyPress(() => {
console.log('inside handler');
handleViewInfoClick(e);
});
}}
那是行不通的。 检测到 Keydown 事件,因此我看到detected keydown
打印出来。 然而,里面的代码并没有被调用。
这样做的正确方法是什么?
问题是handleKeyPress
返回一个 function (这是有道理的,因为您通常使用onKeyDown
的返回值),但是在您尝试使用事件 object 的示例中,您没有调用它,您只是在调用handleKeyPress
创建 function 然后不调用 function。
我将修改handleKeyPress
,使其传递事件object:
const handleKeyPress = (cb: (e: KeyboardEvent) => void) => (e: KeyboardEvent) => {
// ^^^^^^^^^^^^^^^^
if (e.keyCode !== Keys.TAB) cb(e);
// ^
};
然后用法几乎与您的原始用法完全相同,您只需包含处理程序:
<div
className={classes.link_complete}
onClick={handleOnClick}
onKeyDown={handleKeyPress((e) => handleViewInfo(e))}
tabIndex={0}
role="button"
>
或更简洁地说:
<div
className={classes.link_complete}
onClick={handleOnClick}
onKeyDown={handleKeyPress(handleViewInfo)}
tabIndex={0}
role="button"
>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.