22

一部のデスクトップ アプリでは、「キャリッジ リターン」キーとテンキーの「Enter」キーの扱いが異なります。これら 2 つのキーが Javascript (jQuery) で同じ keyCode (13) を生成することに気付きました。

それらはブラウザ環境で等しくなるように変換されますか、それともそれらを区別することは可能ですか (つまり、CR でテキスト領域に新しい行を作成し、「Enter」キーでフォームを送信しますか?

4

4 に答える 4

18

Javascript Madness: Keyboard Eventsに関する Jan Wolters の論文を参照してください。

EnterNumpad Enterブラウザは 2 つのキーを区別しないため、どちらも同じキーコード (つまり 13) を与えます。正直なところ、ほとんどの環境も同様です。(たとえば) Windows API を使用してそれらを区別することは可能ですが、それには余分な労力がかかります。ただし、これはブラウザの抽象化の範囲外です。

アップデート

ビル・ソーンが正当に言及しているように、このKeyboardEventオブジェクトlocationは今日では特性を備えています。

Mozilla Developer Networkから:

可能な値は次のとおりです。

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 を示します。

于 2011-03-24T11:41:15.130 に答える
11

物理的に異なるキーがキーボードにある場合、ブラウザ アプリケーションはデスクトップ アプリケーションと同じように差別化できるはずです。

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....
}
于 2015-01-13T16:11:17.787 に答える