Barcode Scanner im Browser richtig einlesen

Barcode Scanner in Verbindung mit Browser können richtig abenteuerlich werden. Vor kurzem, hatte ich die Aufgabe mit Barcodes, die von einem Scanner eingelesen werden in einer Webapplikation zu arbeiten. Ein Barcode Scanner ist grundsätzlich nichts anderes, als eine emulierte Tastatur der einfach die Zeichen des Barcodes der Reihe nach als Tastenschläge eintippt. Somit kann das Gerät in jeder beliebigen Software verwendet werden ohne umständlich mit DLLs oder sonstigem zu handieren.

Normalerweise fängt man diese Eingaben dann mit einem Keypress Event in der Applikation ab und verarbeitet sie weiter. Das funktioniert in der Theorie und beim Testen mit der Tastatur hervorragend. Als ich jedoch das erste mal den Scanner testete kam alles anders. Im Notepad schreibt der Scanner genau das hin, was er auch als Barcode einliest. In der Webapplikation mit Javascript im Browser jedoch nicht. Das Keypress Event ist in der Webwelt noch nicht standardisiert und so werden für jedes Zeichen das der Scanner schickt genau vier Zeichen an das Keypress Event übergeben. Drei Integer Werte die zusammen den ASCII Code ergeben und danach das Zeichen selbst.

Das merkwürdige Verhalten ensteht, weil der Barcodescanner jedes Zeichen als KeyUP ALT + 3 stellige ASCII Kombination versendet (Mein Testgerät war ein Symbol LS3008 Motorola). Der Browser erkennt das Keyup Event nicht richtig und gibt es als Keypress Event weiter. Die Lösung war, dass ich einfach die letzten drei Zeichen abfrage, diese in Integer konvertiere und danach abfrage ob das ASCII Zeichen den selben Wert ergibt wie das letzte Zeichen. Erst dann behandle ich das Zeichen weiter als ein Zeichen. Ein nicht ganz schöner Workaround aber leider die einzige Lösung.

var barcodeAltBuffer = "";

$(document).keypress(barcodeAltInput);

function barcodeAltInput(e)
{
    if (barcodeAltBuffer.length >= 3)
    {
        // convert ascii code to character
        var asciiCode = barcodeAltBuffer.substring(barcodeAltBuffer.length - 3);
        var input = String.fromCharCode(parseInt(asciiCode));
        
        if (input == String.fromCharCode(e.which))
        {
            // die letzten 3 zeichen eingaben
            // und die aktuelle eingabe ergeben den gleichen ascii code
            // 0 - 4 - 5 == 45
            // barcode scanner hat jetzt EIN zeichen eingelesen
            barcodeInput(e);
            barcodeAltBuffer = "";
        }
    }
    
    barcodeAltBuffer += String.fromCharCode(e.which);
}

function barcodeInput(e)
{
    var s = String.fromCharCode(e.which);
    alert(s);
}