ContentEditableでpreventDefault可能なショートカットキー一覧(Max OS編)



## はじめに

本記事はMac OS上での動作を想定しています。[Windows 10はこちら](https://qiita.com/pochman/items/f4657f948aebcfc411f6)

ブラウザごとに色々なショートカットがありますが、これをキャンセルし、独自のショートカットを追加したい時があります。

特にJavascriptでリッチテキストエディタを作る場合を想定し、`contentEditable="true"`なelementのイベント発火において`preventDefault()`でキャンセルできるか否かを、実際に試してリストアップしたので共有します。

## 概略


- OSやブラウザ本体の制御に近いものほどpreventDefaultできない。
- 想像以上にショートカットの種類があった。
- Mac OSの場合はkeydownだけでなくbeforeinputでしかキャンセルできない物がある（[参考：過去の投稿記事](https://qiita.com/pochman/items/b99c835bf598810d3c18)）。

蛇足：keydownでpreventDefaultするとElectronのacceleratorも発火しなくなります。一方で、preventDefaultしなかった場合はブラウザのデフォルト動作とacceleratorの発火が共に起こり、これはこれで制御が難しい。

## 環境


- OS: Mac OS 10.14.6 
-   Safari 13.0.4
- Chrome  79.0.3945.117
- Firefox  72.0.1

## 表のみかた

キーボードでキー入力した場合にブラウザの行うデフォルト動作と、keydownイベント、および、beforeinputイベントにおいてpreventDefault()の有効／無効をyes or noで表に示します。preventDefault()でキャンセルできる場合はyes、キャンセルできない場合はnoとしました。先に書いてある方がkeydownイベント、後に書いてある方がbeforeinputイベントです。動作はSafariでの動作を基本とし、それと異なる動作をするブラウザではその旨を併記しました。"なし"と書いてあるところは特にデフォルト動作が無いことを意味します。

ただし、Firefoxではkeydownのみが調査対象です。これはFirefoxではbeforeinputを使う必要が無いからです（[参考：過去の投稿記事](https://qiita.com/pochman/items/b99c835bf598810d3c18)）

## 単独キー入力(without Modifier key)

|key|動作|Safari|Chrome|Firefox|
|---|---|---|---|---|
|A-Z,1-9|文字入力|no/yes|yes/yes|yes|
|1文字分の長さの記号(括弧やカンマなど)|文字入力|no/yes|yes/yes|yes|
|delete|前方文字を消す|yes/yes|yes/yes|yes|
|backspace|後方文字を消す|yes/yes|yes/yes|yes|
|Enter|改行する(段落を区切る)|yes/yes|yes/yes|yes|
|Arrow|カーソル移動|yes/no|yes/no|yes|

# Commandと同時に押した場合

|key|動作|Safari|Chrome|Firefox|
|---|---|---|---|---|
|A|全選択|yes/no|yes/no|yes|
|B||なし|yes/yes|ブックマークを開く/yes|
|C|選択領域をCopy|yes/no|yes/no|yes|
|D|ブックマーク追加|yes/no|yes/no|yes|
|F|page内を検索|yes/no|yes/no|yes|
|G|検索中に次の候補へカーソル移動|yes/no|yes/no|なし|
|H|ブラウザを最小化|no/no|ブラウザを閉じる/yes/no|yes|
|I||メールアカウントのウィンドウをだす/yes/no|選択領域をitalicにする/yes/yes|ページ情報のwindowを表示/yes|
|J||なし|なし|ブラウジングライブラリー/yes|
|K|URL windowで検索(Eと同じ)|なし|なし|yes|
|L|URL バーへカーソル移動|no/no|なし|yes|
|M|ゴミ箱の横に最小化|no/no|yes/no|yes|
|N|新しいwindowsでブラウザを開く|no/no|no/no|no|
|O|ファイルを開く|no/no|yes/no|yes|
|P|ページの印刷|yes/no|yes/no|yes/no|
|Q|ブラウザを閉じる|no/no|no/no|no|
|R|ページの再読み込み|no/no|yes/no|yes|
|S|ページ(html)の保存|no/no|yes/no|yes|
|T|新しいタブを開く|no/no|no/no|no|
|U|選択領域にunderlineを引く|なし|なし|ソースを開く/yes|
|V|Paste|no/yes|yes/yes|yes|
|W|ブラウザ(タブ)を閉じる|no/no|no/no|no|
|X|切り取り|no/no|yes/no(コピーのみされる)|yes|
|Y|履歴を表示|no/no|yes/no|なし|
|Z|Undo|no/yes|yes/yes|yes|
|1-9|タブブラウザの切り替え|no/no|yes/no|yes|
|0|なし||||
|-|ページを縮小|yes/no|yes/no|yes|
|=|なしページを拡大|なし|なし|yes|
|;|次の英単語へ移動|/yes/no|yes/no|ページを拡大/yes|
|+|ページを拡大|yes/no|yes/no|yes|
|^|なし||||
|@|なし||||
|`[`||履歴に合わせてページ遷移/yes/no|なし|yes|
|`]`||履歴に合わせてページ遷移/yes/no|なし|yes|
|:|辞書登録？|yes/no|yes/no|なし|
|/|なし|「ステータスバーはオンです」の表示/yes/no|なし|なし|
|,|ブラウザの設定画面を開く|no/no|yes/no|no|
|.|なし||||
|space|spotlite検索|no/no|no/no|no|
|delete|なし||||
|backspace|現在位置から行の先頭まで削除|yes/no|yes/yes|yes|yes|
|enter|なし||||
|RightArrow|前方へ単語単位で移動|行の末尾へ移動/yes/no|yes/no|yes|yes|
|LeftArrow|後方へ単語単位で移動|行の先頭へ移動/yes/no|yes/no|yes|yes|
|UpArrow|文章の先頭へ移動|/yes/no|yes/no|yes|行の先頭へ移動|
|DownArrow|文章の末尾へ移動|/yes/no|yes/no|yes|行の末尾へ移動|

## Command+Shiftと同時に押した場合

（Shift無しの場合と動作が異なるものだけ記載）

|key|動作|Safari|Chrome|Firefox|
|---|---|---|---|---|
|A||なし|なし|アドオンマネージャー/yes|
|B|お気に入りリンクのバーを出す|yes/no|yes/no|ブラウジングライブラリーを開く/yes|
|C|デバッグwindowを表示|yes/no|yes/no|yes|
|D|時計が動く(謎)|yes/no|ブックマーク編集/yes/no|yes|
|H||なし|ホーム画面へ移動/yes/no|履歴の検索/yes|
|J||なし|ダウンロード履歴/yes/no|デバッグコンソールを別windowで開く/yes|
|L|リーディングリスト|yes/no|なし|なし|
|M||なし|ユーザーログイン/yes/no|なし|
|N|プライベートブラウズで新しいwindowを開く|yes/no|no/no|新しいwindowでブラウザを開く/yes|
|Q|OSからログアウト|no/no|no/no|no|
|R|ページ全体の表示の切り替え|yes/no|yes/no|yes|
|S||なし|なし|スクリーンショートカット/yes|
|T||なし|ダウンロード履歴から検索/no/no|アドオンマネージャー/yes|
|X||なし|なし|全て右寄せにする/yes|
|Z|Redo|yes/yes|yes/yes|yes|
|Arrow,Home,End,Pageup,Pagedown|選択しながらフォーカス移動|yes/no|yes/no|yes|

## Command+Optionと同時に押した場合

（option無しと動作が同じものは省略）

|key|動作|Safari|Chrome|Firefox|
|---|---|---|---|---|
|A|デバッグwindowを開く|yes/no|なし|なし|
|B|ブックマーク|yes/no|yes/no|なし|
|C|デバッグwindowを表示|yes/no|yes/no|yes|
|D|下のMac特有のアプリのバーが消える|no/no|no/no|no|
|F|URLwindowでお気に入り選択|yes/no|URLwindowにカーソルが移動/yes/no|URIwindowで検索/yes|
|I|デバッグwindowを表示|yes/no|yes/no|yes|
|J|デバッグwindowを表示|なし|yes/no|なし|
|K|デバッグwindowを表示|なし|なし|yes|
|M||なし|なし|モバイル機器表示エミュレータ/yes|
|U||なし|なし|ソースの表示/yes|
|Z|デバッグwindowを表示|なし|なし|yes|
|1-9|お気に入り？おすすめ？の1-9番のページへ移動|yes/no|なし|なし|

## 最後に

全部のキーを実際に押して試しました。beforeinputがある分、windowsでの検証の倍時間が掛かった。開発においてはbeforeinputとkeydownの使い分けが必要で、Mac OS、特にSafari対応はほんとキツイです。

間違いに気づいたらごしていき頂ければ幸いです。