それは確かに少し複雑ですが、主に歴史的な理由からです。keypressあなたが見ているのかkeydown/keyupイベントを見ているのかによって物事は異なります。イベントは、keypress可能な限り文字コードで機能します。これは、印刷可能な文字(テキストフィールドに含めることができる文字)の場合、パラメーターが0のときにパラメーターcharCodeを設定する必要があることを意味します。パラメーターは実際には文字のASCIIコードです。つまり、あなたの場合(文字)は次のようになります。 :keyCodecharCodew
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から「借用」されていることに注意してください。