Первая версия универсального контроллера ввода штрих-кодов. Для его использования по идее надо сделать контроллер обработки, который подписывается на событие barcode.
/* global Ext */
/**
* Контроллер ввода штрих-кодов.
*/
Ext.define("Ews.controller.Barcode", {
extend: "Ext.app.Controller",
requires: ["Ews.util.EventUtil"],
barcodePrefix: "$",
barcodeSuffix: "&",
//barcodeSuffixCode: 13,
mode: "listen", // listen | scan
value: "",
init: function() {
var me = this;
// Событие keypress похоже надо заменить на keydown
// [url]http://javascript.ru/forum/extjs/63113-ext-focusmanager-2.html[/url]
Ext.getWin().on("keypress", "onWindowKeyPress", me, { capture: true });
console.group("Слежение за штрих-кодами включено.");
console.log("Префикс:", me.barcodePrefix);
console.log("Суффикс:", me.barcodeSuffix);
console.groupEnd();
},
onWindowKeyPress: function(event) {
var me = this;
var keyChar = Ews.util.EventUtil.getCharFromEvent(event);
if (me.mode == "scan") {
if (keyChar == me.barcodeSuffix) {
//if (event.keyCode == me.barcodeSuffixCode) {
me.end();
} else {
me.resume(keyChar);
}
} else {
if (keyChar == me.barcodePrefix) me.begin();
}
},
begin: function() {
var me = this;
me.value = "";
me.mode = "scan";
console.log("Начат ввод штрих-кода.");
},
resume: function(keyChar) {
var me = this;
me.value += keyChar;
console.log("Ввод штрих-кода продолжается:", keyChar, me.value);
},
end: function() {
var me = this;
me.mode = "listen";
me.onEnterBarcode(me.value);
console.log("Ввод штрих-кода завершен. Введенный код:", me.value);
},
onEnterBarcode: function(barcodeValue) {
var me = this;
me.fireEvent("barcode", barcodeValue);
}
});
И вспомогательная утилитка:
/* global Ext */
Ext.define("Ews.util.EventUtil", {
singleton: true,
/**
* Получение кода символа из события keypress.
* Вспомогательная функция.
* event.type должен быть keypress (функция работает только с keypress).
* [url]https://learn.javascript.ru/keyboard-events[/url]
*/
// Привести в соответствие со свойством browserEvent
// [url]http://docs.sencha.com/extjs/6.0/6.0.1-classic/#!/api/Ext.event.Event-property-browserEvent[/url]
getCharFromEvent: function(event) {
//event = event instanceof Ext.event.Event ? event.browserEvent : event;
if (event.which == null) { // IE
if (event.keyCode < 32) return null; // спец. символ
return String.fromCharCode(event.keyCode);
}
if (event.which != 0 && event.charCode != 0) { // все кроме IE
if (event.which < 32) return null; // спец. символ
return String.fromCharCode(event.which); // остальные
}
return null; // спец. символ
}
});