LoginSignup
2
1

More than 1 year has passed since last update.

ReactでdivにonClickを持たせたい

Posted at

なんとかしたいこと

ReactでdivにonClick属性を持たせようとしたら、以下の二つのエラーが出た。
click-events-have-key-events
no-static-element-interactions
これをなんとかしたい

環境

  • ReactをTypeScriptで書いてる
  • ESLintにAirbnb記法を勉強のために厳格めに入れてる

解決

原因はアクセシビリティに問題があるって話です。てかリファレンスにそう書いてあります。
アクセシビリティを解決できればいいのでやり方は何パターンかありますが、
リファレンスに書いてあるような方法が王道だと思います。

<div
  onClick={()=>{onClickHandler()}}
  onKeyPress={(e)={
    if(e.key==="Enter")onClickHandler();
    }}
  role="button"
  tabIndex="0">
  hoge
</div>

っていう風に、onClickの他に

  • onKeyPress
  • role
  • tabIndex

の三つを追加すればいいです。

理解しよう

アクセシビリティとは、要は「身体障害者でも使えるWebページ」って意味です。
「このままだと一部の身体障害者が使えないWebページになるぜ」って怒られてたんですね。

今回怒られてるのは、主にマウスを使えない人が使用できないっていう点です。
言い換えると、キーボードだけで行えない操作を作っているってことです。

例えばbuttonなどは「イベントを発火するための要素」なので、ブラウザが自動でキーボードだけでイベントを発火可能なようにしてくれます。
つまりブラウザがアクセシビリティを保証してくれます。
しかしdivは本来そういった意味を持つ要素じゃないので、「このdivはbuttonのようにイベントを発火するよ」と明示的にブラウザに教えてあげないといけません。

role="button"

とすることで、「このdivはbuttonとして動作するよ」と宣言しています。

tabIndex="0"

とすることで、「Tabキーでこのdivにフォーカスを当てることができるよ」と宣言しています。

onKeyPress={(e)={
    if(e.key==="Enter")onClickHandler();
    }}

とすることで、「フォーカスが当たってるときEnterキーを押せばクリックと同じ動作になるよ」と宣言しています。

これでTabとEnterで、つまりマウスなしでイベントを発火できるようになりました。
たしかにアクセシビリティが改善されましたね。

参考

非対話型コンテンツにclickイベントを設定してはいけない理由

以上。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1