キーボードのコード確認メモ

## 最初に
javascriptでinputタグにfocus時にセットするメモです。

## キーボードのコード確認
wを押したらメッセージが出る。
```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    document.addEventListener("keydown", function(event) {
      if (event.code === "KeyW") {
        window.alert("Press W to move up.");
      }
    });
  </script>
</body>
</html>
```

## focus時セット確認
aキーとShiftキーを同時に押したことをシミュレートするコード例を以下に示します。このコードでは、keydownイベントを発火させ、Shift + aが押されたことをシミュレートしています。
```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shift + a キーのシミュレーション</title>
</head>
<body>
    <input type="text" id="yourInputId" placeholder="ここに入力">

    <script>
        // 入力欄にフォーカスした時にイベントを発火させる
        document.getElementById('yourInputId').addEventListener('focus', function() {
            // 'keydown' イベントを作成（Shift + a）
            var event = new KeyboardEvent('keydown', {
                key: 'A', // Shift + 'a' を押した状態の結果として 'A' が出力される
                code: 'KeyA',
                keyCode: 65, // 'a' キーの keyCode
                shiftKey: true, // Shiftキーが押されていることを指定
                bubbles: true,
                cancelable: true
            });

            // 入力欄にイベントをディスパッチ（発火）
            this.dispatchEvent(event);
        });

        // イベントを受け取って動作を確認
        document.getElementById('yourInputId').addEventListener('keydown', function(e) {
            console.log(`Key pressed: ${e.key}, KeyCode: ${e.keyCode}, ShiftKey: ${e.shiftKey}`);
        });
    </script>
</body>
</html>
```

## focus時セットメモ(Shift + 無変換確認)

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shift + 無変換 キーのシミュレーション</title>
</head>
<body>
    <input type="text" id="yourInputId" placeholder="ここに入力">

    <script>
        // 入力欄にフォーカスした時にイベントを発火させる
        document.getElementById('yourInputId').addEventListener('focus', function() {
            // 'keydown' イベントを作成（Shift + 無変換）
            var event = new KeyboardEvent('keydown', {
                key: 'NonConvert', // 無変換キーを指定
                code: 'NonConvert', // 無変換キーのコード
                keyCode: 229, // 無変換キーのkeyCode
                shiftKey: true // Shiftキーが押されていることを指定
            });

            // 入力欄にイベントをディスパッチ（発火）
            this.dispatchEvent(event);
        });

        // イベントを受け取って動作を確認
        document.getElementById('yourInputId').addEventListener('keydown', function(e) {
            console.log(`Key pressed: ${e.key}, KeyCode: ${e.keyCode}, ShiftKey: ${e.shiftKey}`);
        });
    </script>
</body>
</html>
```
このコードが全てのブラウザで期待通りに動作するわけではありません。特に日本語の入力モードの切り替えに関するキーイベントは、ブラウザ間での動作が一致しない場合があります。

#### 注意点
- `keyCode`は現在、非推奨とされており、将来的にはブラウザのサポートが削除される可能性があります。そのため、可能であれば`key`や`code`プロパティを使用して、キーの動作を判断することが推奨されます。
- IMEの制御や日本語入力モードに関するキー操作は、ブラウザやオペレーティングシステムに強く依存するため、JavaScriptだけで完璧に制御することは困難です。

## 最低限コード検証
`Shift + 無変換`キーのシミュレーションにおいて、最低限のコード例。
```javascript
var event = new KeyboardEvent('keydown', {
    key: 'NonConvert', // 無変換キーを指定
    shiftKey: true // Shiftキーが押されていることを指定
});
```

このコードは、`keydown`イベントで`Shift + 無変換`のキーが押されたことをシミュレートするための最低限の設定です。

- **`key: 'NonConvert'`**: 無変換キーが押されたことを示します。
- **`shiftKey: true`**: Shiftキーが押されていることを指定します。

この設定で、`focus`イベント時に`Shift + 無変換`をシミュレートすることができます。

## 制限事項
IMEの切り替えや特定のキー操作をJavaScriptで制御できない理由が、セキュリティおよびプライバシーの観点からであることを具体的に示すドキュメントは以下の情報源で確認できます。

### 1. **W3C UI Events Specification**
   - W3Cの仕様書では、JavaScriptによるキーボードイベントの制限について説明があります。特に、ユーザーエージェント（ブラウザ）がシミュレートされたイベントをどのように処理するかに関して、セキュリティとプライバシーの保護を理由に、物理的なキー入力と異なる扱いを受ける可能性があることが明記されています。

   - [W3C UI Events Specification](https://www.w3.org/TR/uievents/#security)（セクション「セキュリティ考慮事項」に記載されています）

### 2. **Mozilla Developer Network (MDN) - KeyboardEvent**
   - MDNの`KeyboardEvent`ドキュメントには、JavaScriptで生成されたイベントがブラウザで異なる扱いを受ける可能性があることが記載されています。特に、システムレベルの操作（例えばIMEの切り替え）をトリガーしないよう、セキュリティ上の制約がかけられていることについて触れています。

   - [MDN Web Docs - KeyboardEvent](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent)

### 3. **Chrome Platform Status - Deprecation of ime-mode**
   - Chromeのプラットフォームステータスにも、`ime-mode`が廃止された理由が示されており、ブラウザ側でのIME制御に対する制限がどのように進化してきたかが理解できます。セキュリティおよびプライバシーに関する考慮がIME制御の制限に繋がっていることが示唆されています。

   - [Chrome Platform Status](https://chromestatus.com/feature/5702549814894592)

### 4. **WebKit Bugzilla - Privacy and Security Concerns**
   - WebKitのバグトラッキングシステムでは、JavaScriptによるシステムレベルの操作（例えばIME制御）がセキュリティおよびプライバシーの観点から制限されている理由が議論されています。

   - [WebKit Bugzilla](https://bugs.webkit.org/show_bug.cgi?id=36435)

### 5. **General Security Principles in Browser Development**
   - ほとんどのモダンブラウザは、セキュリティおよびプライバシーを重視して設計されています。ユーザーの入力に対する過剰な制御を避けるため、ブラウザがユーザーの意図しない動作を防ぐ設計になっていることは、セキュリティに関する一般的な原則として理解されています。以下のリンクで、ブラウザのセキュリティポリシーに関する情報を確認できます。

   - [Mozilla Security Guidelines](https://infosec.mozilla.org/guidelines/web_security)
   - [Google Chrome Security Overview](https://www.chromium.org/Home/chromium-security)

これらの情報源から、ブラウザがセキュリティとプライバシー保護のためにJavaScriptによるIMEの制御を制限している理由を理解することができます。