ハンドヘルドスキャナーでバーコードをスキャンし、Javascriptで結果を処理できるようにしたいと思います。
バーコードスキャナーは、ほとんどキーボードのように機能します。スキャン/翻訳された(バーコード->数字)データをそのまま出力します(右?)。実際には、出力をキャッチして続行するだけです。しかし、どのように?
ここに私が仕事をしたいいくつかの擬似コードがあります:
$(document).on("scanButtonDown", "document", function(e) {
// get scanned content
var scannedProductId = this.getScannedContent();
// get product
var product = getProductById(scannedProductId);
// add productname to list
$("#product_list").append("<li>" + product.name + "</li>");
});
前もって感謝します!
this および this の良い質問が見つかりましたが、処理に関する詳細情報を取得したいと思います。私の場合、テキストエリアに焦点を合わせるだけでは不十分かもしれません。
scanButtonDown
などのイベントをキャッチするスキャナーにアクセスできないため、擬似コードは機能しません。唯一のオプションは、キーボードとまったく同じように動作するHIDスキャナーです。スキャナー入力とキーボード入力を区別するには、タイマーベースまたはプレフィックスベースの2つのオプションがあります。
タイマーベース
スキャナーは、ユーザーがキーボードで(賢明に)できるよりもはるかに高速に文字を入力する可能性があります。キーストロークの受信速度を計算し、getProductsId
関数に渡す変数への高速入力をバッファリングします。 @Vitallは バーコードスキャナー入力をキャッチするための再利用可能なjQueryソリューション を作成しました。onbarcodescannedイベントをキャッチする必要があります。
プレフィックスベース
ほとんどのスキャナーは、スキャンされたすべてのデータにプレフィックスを付けるように構成できます。プレフィックスを使用してすべての入力のインターセプトを開始し、バーコードを取得したら入力のインターセプトを停止できます。
完全開示:私は、ハンドヘルドスキャナーを製造するSocket Mobile、Inc.のコンサルタントとして働いています。
多くの調査とテストを行った後、フォーム入力に焦点を合わせずにバーコードスキャナーから入力をキャプチャすることが、私にとって最も効果的なものでした。 keydown
およびtextInput
イベントをリッスンします。
textInput
イベントは、paste
イベントのように機能します。その後、バーコードデータ全体が含まれます。私の場合、UPCバーコード。e.preventDefault()
は、バーコードデータがフォーム入力に挿入されないようにします:
document.addEventListener('textInput', function (e){
if(e.data.length >= 6){
console.log('IR scan textInput', e.data);
e.preventDefault();
}
});
これをAndroid 4.4および7.0でCipherLab IRスキャナーでテストしました。
keydown
イベントをリッスンする例。私の場合、フォーム入力がフォーカスされていない限り、ユーザーはバーコードをスキャンしていると想定できます。
let UPC = '';
document.addEventListener("keydown", function(e) {
const textInput = e.key || String.fromCharCode(e.keyCode);
const targetName = e.target.localName;
let newUPC = '';
if (textInput && textInput.length === 1 && targetName !== 'input'){
newUPC = UPC+textInput;
if (newUPC.length >= 6) {
console.log('barcode scanned: ', newUPC);
}
}
}
もちろん、文字列の長さをチェックしてスキャンを決定するのではなく、e.keyCode === 13
keydown
イベントリスナー。
すべてのIRスキャナーがtextInput
イベントをトリガーするわけではありません。お使いのデバイスがそうでない場合は、次に類似したものを放出しているかどうかを確認できます:
monitorEvents(document.body);
ここでこの監視のトリックを見つけました: jQueryの要素によって発生したすべてのイベントをどのように記録しますか?
OK、だからここに私がやった方法だ。スキャナーをセットアップして、プレフィックスを追加します(私の場合は、Ctrl + 2またはASCIIコード002(制御コード)を使用して、キーボードから簡単に入力できないようにしました)。これを変更して、バーコードデータにエンターが含まれている場合は、各バーコードスキャン後にCtrl + 3またはASCIIコード003などを使用します)。 jQueryでは、keypressイベントをキャプチャし、プレフィックスを探します。その後、すべてを文字列にキャプチャし、アプリがリッスンできるカスタムイベントを起動します。 keypressイベントを防止しているため、ユーザーはテキストフィールドにいることができ、バーコードをスキャンすることができます。
さらに、各バーコードには、スキャンするバーコードの種類を識別するために使用する1桁のプレフィックスがあります。例:
let barcodeRead = '';
let readingBarcode = false;
let handleKeyPress = (e) => {
if (e.keyCode === 2) {
// Start of barcode
readingBarcode = true;
e.preventDefault();
return;
}
if (readingBarcode) {
e.preventDefault();
if (e.keyCode === 13) { // Enter
readingBarcode = false;
const evt = $.Event('barcodeScan');
evt.state = {
type: barcodeRead.substr(0, 1),
code: barcodeRead.substr(1),
};
$(window).trigger(evt);
barcodeRead = '';
return;
}
// Append the next key to the end of the list
barcodeRead += e.key;
}
}
$(window).bind('keypress', handleKeyPress);
このプレフィックスにより、バーコードのタイプを識別し、このページで処理する必要があるかどうかを確認できるようになりました。例:
$(window).bind('barcodeScan', (e) => {
if (e.state.type !== 'E') {
alert('Please scan your employee badge only!');
} else {
$('#employee-badge').val(e.state.code);
}
});
バーコードスキャナーは、ほとんどキーボードのように機能します。
モデルによって異なります。私が使用したものはすべて、キーボードとまったく同じように機能します(少なくともコンピューターに関する限り)
スキャン/翻訳された(バーコード->数字)データをそのまま出力します(右?)。
キーコードを出力します。
$(document).on("scanButtonDown"
おそらくkeypress
ではなくscanButtonDown
が必要でしょう。
イベントオブジェクトを見て、押された「キー」を判別します。
コード全体がスキャンされたタイミングを判断するには、「データの終わり」キー(スペースまたはリターン)を取得するか、入力されている文字数をカウントする必要があります。
var txt = "";
function selectBarcode() {
if (txt != $("#focus").val()) {
setTimeout('use_rfid()', 1000);
txt = $("#focus").val();
}
$("#focus").select();
setTimeout('selectBarcode()', 1000);
}
$(document).ready(function () {
setTimeout(selectBarcode(),1000);
});
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="text" name="tag" id="focus" placeholder="Use handheld RFID scanner">
私はバーコードスキャンとクレジットカードスキャン(jQuery上に構築)を処理するプラグインの作業を開始しました:
https://github.com/ericuldall/jquery-pos
簡単な実装:
$(function(){
$(document).pos();
$(document).on('scan.pos.barcode', function(event){
var barcode = event.code;
//handle your code here....
});
});
これまでのところ、このプラグインは1種類のスキャナーと数字のみを含むコードでのみテストされていますが、それ以外の要件が機能しない場合は、お客様のニーズに合わせて調整させていただきます。 githubページをチェックして、旋回してください。貢献が奨励されています。
E
私は少し遅れていますが、ここでいくつかの答えに基づいてこの作業を行いました。
let code = "";
let reading = false;
document.addEventListener('keypress', e=>{
//usually scanners throw an 'Enter' key at the end of read
if (e.keyCode===13){
if(code.length>10){
console.log(code);
/// code ready to use
code="";
}
}else{
code+=e.key;//while this is not an 'enter' it stores the every key
}
//run a timeout of 200ms at the first read and clear everything
if(!reading){
reading=true;
setTimeout(()=>{
code="";
reading=false;
}, 200);} //200 works fine for me but you can adjust it