1

数字キーを押すと、特別な PC キーボードが JavaScript で奇妙なコードを生成するという奇妙な状況があります。

このサイト ( http://unixpapa.com/js/testkey.html ) を使用して、数字の 4 を押すとキーボードがこれを生成することがわかりました。

keydown  keyCode=18        which=18        charCode=0        
keydown  keyCode=101 (e)   which=101 (e)   charCode=0        
keyup    keyCode=101 (e)   which=101 (e)   charCode=0        
keydown  keyCode=98  (b)   which=98  (b)   charCode=0        
keyup    keyCode=98  (b)   which=98  (b)   charCode=0        
keyup    keyCode=18        which=18        charCode=0        
keypress keyCode=52  (4)   which=52  (4)   charCode=52  (4)  

通常のキーボードでは次のようになります。

keydown  keyCode=52  (4)   which=52  (4)   charCode=0        
keypress keyCode=52  (4)   which=52  (4)   charCode=52  (4)  
keyup    keyCode=52  (4)   which=52  (4)   charCode=0        

つまり、基本的に、この奇妙なデバイスは ALT キーを保持し、他の 2 つの文字を追加し、ALT キーを手放し、キーダウンとキーアップを完全に無視して、実際のキーのキープレス イベントのみを発生させます。

event.altKey問題なく最初の部分を除外できますが、問題を引き起こしているのは残りの部分です。

問題は、私のコードがキーダウンとキーアップで別のことをするように書かれていて、この1つのキーボードだけにキープレスを追加するとすべてが台無しになることです...

これに対する解決策があるとは思えません。おそらくこれをサポートしないでしょう...奇妙なハードウェアですが、念のため:

キーボードがキープレスのみを作成するかどうかを検出する方法についてのアイデアはありますか (event.altKeyその前に他のイベントを除外した後)。

現在のイベントコードを含み、キープレスとキーアップの両方でリセットされ、それ以外の場合は現在のキーコードを受け取るグローバル変数を用意しようとしましたが、これを機能させることができません...

これが私のコードです:

<input type="text" name="entry" id="entry" onkeyup="Entry('up', this, event);" onkeydown="Entry('down', this, event);" />

はい、すべてのキーボード イベントはテキスト フィールドに渡されるはずなので、returnここでは必要ありません。そして JavaScript:

function Entry(dir, field, evt)
{
    // filter out Num Lock, Alt and Alt Pressed
    if (evt.keyCode == 144 || evt.keyCode == 18 || evt.altKey)
        return false;

    if (dir == 'up')  // keyup
    {
        if (field.value.length > 0) 
        { 
            if (evt.keyCode == 13) // Enter pressed
            {
                EnterUser();  // if more entries are found with FindUser(), select the first one, otherwise empty the screen
            }
            else 
            {
                FindUser();  // start ajax that checks field content vs database
            }
        }
    }
    else  // keydown
    {
        if (!field.disabled)
        {
            EmptyScreen();  // if the text field is disabled because a dialog box is in front, empty the screen.
        }
    }
}

もちろん、秘訣は、現在動作している他のキーボードやバーコード スキャナーを壊さずに、この奇妙なキーボードをサポートすることです。

顧客に「申し訳ありませんが、適切なキーボードを入手してください」または何かを伝えなければならない可能性がありますが、それは私を悩ませています :-)

これについて何か考えはありますか?

ありがとう!

PS: 私はそのサイトに jQuery を持っているので、それを使用する良いアイデアがあれば、私も挑戦します。

4

1 に答える 1