问题:可访问性 - React 确保点击事件有关键事件

我想确保我所有的 onClick 事件都在 onKeyDown 事件旁边。

我将使用 eslint-plugin-jsx-a11y 来确保这一点。但是在代码中,这是一种通用的方法。我的意思是,一直这样做会很烦人:

 if(event.keyCode === 13){
    ...
 }

我想有一种方法来告诉 onKeyDown 中的元素,以防用户使用 onClick 中的执行功能。或类似的解决方案,如http://www.karlgroves.com/2014/11/24/ridiculously-easy-trick-for-keyboard-accessibility/

以角度为例,我很清楚。让我们使用指令自动执行此操作。但在 React 中,我不知道哪个是最好的方法。


eslint 规则:https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/click-events-have-key-events.md

解答

最后我只看到2个解决方案:

1 我可以创建一个封装所有这些动作的组件......但这是一个按钮的工作。而且我不想在我的项目中打开一种创建按钮的新方法,这只是为了例外,这可能会在项目内部产生恶性行为。为此,我们还有另一个组件......按钮:)

2 为动作创建一个装饰器。

export function a11yButtonActionHandler(target, key, descriptor) {
    const fn = descriptor.value;
    if (typeof fn !== 'function') {
        throw new Error(`@a11yButtonActionHandler decorator can only be applied to methods not: ${typeof fn}`);
    }

    descriptor.value = function actionHandler(event) {
        if (!event || event.type === 'click' ||
            (['keydown', 'keypress'].includes(event.type) && ['Enter', ' '].includes(event.key))
        ) {
            fn.call(this, event);
        }
    };

    return descriptor;
}

并使用装饰器。

@a11yButtonActionHandler
myAction(event) {
 ...
}

<div className="element-with-very-good-excuse-to-dont-be-a-button"
     role="button"
     tabIndex="0"
     onKeyDown={ this.myAction }
     onClick={ this.myAction }>
Logo

React社区为您提供最前沿的新闻资讯和知识内容

更多推荐