一部のデスクトップ アプリでは、「キャリッジ リターン」キーとテンキーの「Enter」キーの扱いが異なります。これら 2 つのキーが Javascript (jQuery) で同じ keyCode (13) を生成することに気付きました。
それらはブラウザ環境で等しくなるように変換されますか、それともそれらを区別することは可能ですか (つまり、CR でテキスト領域に新しい行を作成し、「Enter」キーでフォームを送信しますか?
一部のデスクトップ アプリでは、「キャリッジ リターン」キーとテンキーの「Enter」キーの扱いが異なります。これら 2 つのキーが Javascript (jQuery) で同じ keyCode (13) を生成することに気付きました。
それらはブラウザ環境で等しくなるように変換されますか、それともそれらを区別することは可能ですか (つまり、CR でテキスト領域に新しい行を作成し、「Enter」キーでフォームを送信しますか?
Javascript Madness: Keyboard Eventsに関する Jan Wolters の論文を参照してください。
Enter
Numpad Enter
ブラウザは 2 つのキーを区別しないため、どちらも同じキーコード (つまり 13) を与えます。正直なところ、ほとんどの環境も同様です。(たとえば) Windows API を使用してそれらを区別することは可能ですが、それには余分な労力がかかります。ただし、これはブラウザの抽象化の範囲外です。
アップデート
ビル・ソーンが正当に言及しているように、このKeyboardEvent
オブジェクトlocation
は今日では特性を備えています。
可能な値は次のとおりです。
DOM_KEY_LOCATION_STANDARD
0
キーに 1 つのバージョンしかないか、キーの左右のバージョンを区別できず、テンキーまたはキーパッドの一部と見なされるキーが押されていません。
DOM_KEY_LOCATION_LEFT
1
キーは左側バージョンのキーでした。たとえば、左側の Control キーが標準の 101 キー US キーボードで押されました。この値は、キーボード上で可能な位置が複数あるキーにのみ使用されます。
DOM_KEY_LOCATION_RIGHT
2
キーは右手バージョンのキーでした。たとえば、標準の 101 キー US キーボードでは、右側の Control キーを押します。この値は、キーボード上で可能な位置が複数あるキーにのみ使用されます。
DOM_KEY_LOCATION_NUMPAD
3
キーがテンキーにあったか、テンキーに対応する仮想キーコードを持っています。注: NumLock がロックされている場合、Gecko はテンキーのキーに対して常に DOM_KEY_LOCATION_NUMPAD を返します。それ以外の場合、NumLock がアンロックされていて、キーボードに実際に数字キーパッドがある場合、Gecko は常に DOM_KEY_LOCATION_NUMPAD も返します。一方、ノートブック コンピューターなど、キーボードにキーパッドがない場合、一部のキーは、NumLock がロックされている場合にのみテンキーになります。そのようなキーがキー イベントを発生させると、location 属性の値はキーによって異なります。つまり、DOM_KEY_LOCATION_NUMPAD であってはなりません。注: NumLock キーのキー イベントは、Gecko と Internet Explorer の両方で DOM_KEY_LOCATION_STANDARD を示します。
物理的に異なるキーがキーボードにある場合、ブラウザ アプリケーションはデスクトップ アプリケーションと同じように差別化できるはずです。
Chrome (39.0.2171.95 m)、Firefox (32.0.3)、IE (11.0.9600.17501)、Opera (12.17) の最新バージョンでは、キーボード イベント オブジェクトに location プロパティが追加されました。軽く文書化されていますが、このプロパティはしばらくの間存在していたと思います。
onkeydown のテストにより、「通常の」Enter キーが押されたときに、keyCode=13 および location=0 であることが明らかになりました。テンキーのエンターが押されると、keyCode=13 および location=3 になります。
したがって、次のコードを使用して、Enter の場合は key==13、テンキーの場合は key==176 を設定できます。
window.onkeydown=function(ev)
{
var e= ev || window.event,
key = e.keyCode || e.which;
if ((key==13) &&
(e.location===3))
key=176; // 176 is the scancode for the numpad enter
// continued....
}