それは確かに少し複雑ですが、主に歴史的な理由からです。keypress
あなたが見ているのかkeydown
/keyup
イベントを見ているのかによって物事は異なります。イベントは、keypress
可能な限り文字コードで機能します。これは、印刷可能な文字(テキストフィールドに含めることができる文字)の場合、パラメーターが0のときにパラメーターcharCode
を設定する必要があることを意味します。パラメーターは実際には文字のASCIIコードです。つまり、あなたの場合(文字)は次のようになります。 :keyCode
charCode
w
evt.initKeyEvent("keypress", true, true, window, 0, true, 0, 0, 0, "w".charCodeAt(0));
印刷できない文字の場合、またはkeydown
/keyup
イベントを使用する場合は、keyCode
パラメーターを設定し、0を。として渡す必要がありますcharCode
。このパラメーターは、仮想キーコードを参照します。ここで使用するキーコードは次のDOM_VK_W
とおりです。
evt.initKeyEvent("keydown", true, true, window, 0, true, 0, 0, evt.DOM_VK_W, 0);
定数DOM_VK_W
はFirefoxでのみ定義されていますが、他のブラウザとの互換性のために、その数値を使用する必要があります。
evt.initKeyEvent("keydown", true, true, window, 0, true, 0, 0, 87, 0);
仮想キーコードは多くの文字のASCIIコードと同じですが、同じものではありません。特に、仮想キーコードは、キーボードで押されている実際のボタンを参照するため、小文字と大文字を区別しません。CtrlWこれは、で処理されるようなキーの組み合わせには関係ありませんkeydown
。一方、テキストフィールド(処理keypress
)はこの違いに非常に注意を払っています。ここでは、追加される実際の文字を示すASCIIコードが使用されています。
このアプローチ(キーボードで押されたボタンのイベントとこれらのボタンが生成する実際の文字を区別する)と実際の仮想キーコードの両方がWindowsから「借用」されていることに注意してください。