Closed yamamoto-yuta closed 1 year ago
一回イベントアクションを発火させないとイベント登録がされず、書いたイベント処理が実行されない。なので、イベントアクションを Ctrl + j にして同じショートカットにするのが良さそう。
The callback parameter looks like:
(command: string, tab?: [tabs.Tab](https://developer.chrome.com/docs/extensions/reference/tabs/#type-Tab)) => void
https://developer.chrome.com/docs/extensions/reference/commands/#event-onCommand
On macOS Ctrl is automatically converted into Command.
To use the Control key on macOS, replace Ctrl with MacCtrl when defining the "mac" shortcut.
Using MacCtrl in the combination for another platform will cause a validation error and prevent the extension from being installed.
https://developer.chrome.com/docs/extensions/reference/commands/#key-combinations
e.ctrlKey は Windows ctrlキー、Mac controlキー、e.metaKey は Mac commandキーに割り当てられています。 JavaScript での Windows Ctrl キーと Mac Command キーの判定 | クロジカ
Manifest と逆なので注意
これ設定しても何回もイベントが登録されてしまった。 上記「Manifest と逆」問題が原因だった。そこ直したらちゃんと1回だけになった。
ただし、 Ctrl + j の Ctrl でonce、 j でonce という呼び方をされてしまって意図した挙動にならない…
→ if (((e.ctrlKey && !e.metaKey) || (!e.ctrlKey && e.metaKey)) && e.key === "j")
の最後に removeEventLisner()
を呼ぶことで解決した。おそらく↓になってる。
chrome.commands.onCommand.addListener()
が発火するdocument.addEventListener("keydown", handleShortcuts)
が実行され、イベントリスナに handleShortcuts()
が登録されるchrome.commands.onCommand.addListener()
が発火するdocument.addEventListener("keydown", handleShortcuts)
が実行され、イベントリスナに handleShortcuts()
が登録されるhandleShortcuts()
が実行され、document.removeEventListener("keydown", handleShortcuts);
が実行されるテキストエリア以外で Ctrl + j した場合もちゃんと document.removeEventListener()
が実行される。
それ以外の場合はそもそも chrome.commands.onCommand.addListener()
が発火しないので document.addEventListener()
が実行されない。
Target.addEventListener(イベントの種類, 呼び出し関数, {once: true});
そもそもイベントリスナへの登録自体不要だった…
Windows だと Ctrl 系が予約されまくってるせいか chrome.commands
では上書きできない模様…
一旦、 Windows は Alt + j Mac は Cmd + j で行く
やっぱり広範囲なホスト権限は審査が通りにくいため…
関連Issue:
12
17