6

バーコードスキャナーを接続した図書館システム用のウェブアプリを書いています。スキャナーの入力はキーボード入力として表示され~~[\d]+.[\d]+~~、たとえば、常に次の形式になります~~470.002~~

スキャナー入力用にjQueryリスナーを設定したいのですが、jQueryの初心者です。すべてのキーボード入力をリッスンする必要がありますが、アクションを実行するのは、スキャナーからの入力を聞いたとき、およびスキャナーの入力が終了したときだけです。

これは私が持っている限りです(つまり、それほどではありません):

//Global functions: call on all pages.
$(document).ready(function() {
    // Listen for scanner input. 
    $(window).keypress(function(e) {
        var key = e.which;
        if (key==126) {.
            alert('tilde');
            // How to listen for the correct input?
            // check_out_book();
        }
    });
});

必要な形式で入力を聞き続けるための最良の方法は何ですか?を呼び出す前に、最後の2つのチルダをリッスンしてほしいcheck_out_book()

また、一時停止がある場合は、最初のチルダの後でリスニングを「停止」して、人間のタイピストと自動スキャナー入力を区別したいと思います。jQueryにはこれを行う方法がありますか?

どんなポインタでも大歓迎です!ありがとうございました。

4

2 に答える 2

8

これまでに受け取ったものを保存し、それが有効かどうかを確認することで、これを実行したいと思います。そうでない場合は、受け取ったものを破棄して、最初からやり直してください。

$(document).ready(function(){
    var input = '',
        r1 = /^~{1,2}$/,
        r2 = /^~{2}\d+$/,
        r3 = /^~{2}\d+\.$/,
        r4 = /^~{2}\d+\.\d+$/,
        r5 = /^~{2}\d+\.\d+~{1}$/
        r6 = /^~{2}\d+\.\d+~{2}$/;

    $(window).keypress(function(e) {
        input += String.fromCharCode(e.which);

        if (r1.test(input) || r2.test(input) || r3.test(input) || r4.test(input) || r5.test(input)) {
            // input is valid so far, continue
        } else if (r6.test(input) {
            // input is valid and complete
            check_out_book();
        } else {
            // input is invalid, start over
            input = '';
        }
    });
});

これらすべての正規表現を2つに組み合わせることができますが、この方法の方が読みやすいと思います。

于 2011-01-07T00:24:58.370 に答える
4

入力フィールドへの入力にバーコードスキャナーが使用されたかどうかを検出し、使用された場合はフォーカスを次のフィールドに移動するJavaScriptを少し書き終えたところです。

私のコードは、「スキャナー入力用にjQueryリスナーを設定したいのですが、jQueryの初心者です。すべてのキーボード入力をリッスンする必要がありますが、スキャナーからの入力を聞いたときにのみアクションを実行します。スキャナー入力が終了したとき。」

入力フィールドのHTMLは次のとおりです。

<input type="text" class="bcode" id="f1" onkeydown="typeSpeed(new Date().getTime());" onblur="typeSpeedReset();" onfocus="typeNextField('f2');" />
<input type="text" class="bcode" id="f2" onkeydown="typeSpeed(new Date().getTime());" onblur="typeSpeedReset();" onfocus="typeNextField('f3');" />
<input type="text" id="f3" />

バーコードスキャナーエントリ(f1とf2)を対象としたクラス「bcode」の2つのフィールドがあります。3番目のフィールドは、通常の入力(f3)を対象としています。フィールドf1およびf2は、(1)キーが押されたときの現在のタイムスタンプを関数'typeSpeed'に送信し、(2)フィールドがフォーカスを取得したときに選択する次のフィールドのIDを送信します。これらのフィールドは、フィールドがフォーカスを失ったときに関数'typeSpeedReset'の呼び出しもトリガーします。

これを機能させるjavascript/jQueryは次のとおりです。

$(function(){   
    var typingTimeout;
    $('.bcode').keypress(function(e){
        if (typingTimeout != undefined) clearTimeout(typingTimeout);
        typingTimeout = setTimeout(isBarcode, 500); 
    }); 
});

var ts0 = 0, ts1 = 0, ts2, nf;

function typeSpeed(time) {
    ts0 = (ts0 == 0) ? time : 0;
    var ts3 = ts1;  
    ts1 = time - ts0;   
    ts2 = ts1 - ts3;    
}

function typeSpeedReset() { ts0 = 0; ts1 = 0; }

function typeNextField(nextfield) { nf = nextfield; }

function isBarcode() {
    if(ts2 < 20 && ts1 != 0) { $('#'+nf).focus(); }
}

何が起こるかというと、キーストローク間の時間は関数「typeSpeed」によって定量化されます。実験(キーボードをマッシュするか、キーを押したままにする)を通じて、人間の最速の入力には、キーストローク間で約33msの遅延があることがわかりました。私がテストに使用したバーコードスキャナーは、一般的に10ms以下の遅延を生成しました。

クラス'bcode'のフィールドにタイムアウトが設定され、入力が一時的に停止したことを検出します。この時点で、遅延が評価されます。20ms未満の場合、バーコードスキャナーが使用されたと見なされ、次のフィールドにフォーカスが与えられます。

このコードが作成されたプロジェクトは、フィールドの背景色を変更し、フォーカスがあるときにフィールドの右側に小さなバーコードグラフィックを表示することでさらに一歩進んで、ユーザーがバーコードスキャナーに応答し、バーコードスキャナーを対象としていることを明確に示します。入力。

于 2013-04-12T19:50:11.320 に答える