まくろぐ
更新: / 作成:

D3.js でキーボードからの入力イベントを扱うコードのサンプルです。

図: クリックしてから上下左右キーで動かす

次の例では、svg 要素でキーボードイベントをハンドルしています。 svg 要素がフォーカスされた状態でカーソルキー(上下左右)を入力すると、丸印 (circle) が上下左右に動きます。

<svg id="svg-z5a3fzu" width="200" height="100"></svg>
<script>
const svg = d3.select("#svg-z5a3fzu");  // D3 Selection オブジェクトを取得

svg
  .on("keydown", handleKeyDown)  // keydown イベントのハンドラーを設定
  .attr("tabindex", 0)  // フォーカスを当てられるようにする
  // .node().focus()  // 自動でフォーカスする場合

// カーソルキーで動かせる丸を表示
const circle = svg.append("circle")
  .attr("cx", 100)
  .attr("cy", 50)
  .attr("r", 10)
  .attr("fill", "dodgerblue")

function handleKeyDown(event) {
  switch (event.code) {
    case "ArrowLeft":
      circle.attr("cx", +circle.attr("cx") - 5)
      event.preventDefault();
      break;
    case "ArrowRight":
      circle.attr("cx", +circle.attr("cx") + 5)
      event.preventDefault();
      break;
    case "ArrowUp":
      circle.attr("cy", +circle.attr("cy") - 5)
      event.preventDefault();
      break;
    case "ArrowDown":
      circle.attr("cy", +circle.attr("cy") + 5)
      event.preventDefault();
      break;
  }
}
</script>

ある要素でキーボードイベントをハンドルするには、tabindex 属性を設定してその要素をフォーカスできるようにしておく必要があります。 また、上下左右キーはデフォルトでブラウザ画面のスクロール動作に割り当てられているので、この振る舞いを event.preventDefault() で抑制しています。

ブラウザ上でキーボードイベントを適切に処理するには、こういった細かいケアが必要になってくるため、基本的には マウスイベント だけで動作するアプリケーション仕様を考えるのがよさそうです。

関連記事

まくろぐ
サイトマップまくへのメッセージ