Захват событий считывателя штрих-кода (клавиатура-клин) из JavaScript
Я занимаюсь разработкой веб-приложения, которое должно использоваться на устройствах Honeywell Dolphin 75e под управлением Android 4.4. Встроенный считыватель штрих-кода может работать в режиме "раскладки клавиатуры", но только тогда, когда текстовое поле имеет фокус.
В настольных браузерах я могу использовать этот код для захвата событий считывателя штрих-кода:
var BarcodesScanner = {
barcodeData: '',
deviceId: '',
symbology: '',
timestamp: 0,
dataLength: 0
};
function onScannerNavigate(barcodeData, deviceId, symbology, timestamp, dataLength){
BarcodesScanner.barcodeData = barcodeData;
BarcodesScanner.deviceId = deviceId;
BarcodesScanner.symbology = symbology;
BarcodesScanner.timestamp = timestamp;
BarcodesScanner.dataLength = dataLength;
$(BarcodesScanner).trigger('scan');
}
BarcodesScanner.tmpTimestamp = 0;
BarcodesScanner.tmpData = '';
$(document).on('keypress', function(e){
e.stopPropagation();
var keycode = (e.keyCode ? e.keyCode : e.which);
if (BarcodesScanner.tmpTimestamp < Date.now() - 500){
BarcodesScanner.tmpData = '';
BarcodesScanner.tmpTimestamp = Date.now();
}
if (keycode == 13 && BarcodesScanner.tmpData.length > 0){
onScannerNavigate(BarcodesScanner.tmpData, 'FAKE_SCANNER', '', BarcodesScanner.tmpTimestamp, BarcodesScanner.tmpData.length);
BarcodesScanner.tmpTimestamp = 0;
BarcodesScanner.tmpData = '';
} else if (e.charCode && e.charCode > 0) {
BarcodesScanner.tmpData += String.fromCharCode(e.charCode);
}
});
$(BarcodesScanner).on('scan', function(e){
alert();
});
К сожалению, это не работает на Android. Есть ли API, позволяющий мне фиксировать эти события? Или другой браузер, который обрабатывает это?
РЕДАКТИРОВАТЬ:
Мне удалось перехватить события считывателя штрих-кода, используя текстовое поле в качестве буфера.
Но в этом случае я не могу использовать какие-либо элементы управления, которые требуют внимания в моем приложении. Что является серьезным недостатком.
BarcodesScanner.tmpInput = $('<input />', {
type: 'text',
style: 'position: fixed; top: 0; right: 0; width: 0; height: 0;'
});
$('body').append(BarcodesScanner.tmpInput);
setInterval(function(){
BarcodesScanner.tmpInput.focus();
}, 500);
BarcodesScanner.tmpInput.on('input', function(e){
if (BarcodesScanner.tmpInput.val().length > 0){
onScannerNavigate(BarcodesScanner.tmpInput.val(), 'FAKE_SCANNER', 'WEDGE', Date.now(), BarcodesScanner.tmpInput.val().length);
BarcodesScanner.tmpInput.val('')
}
});
4 ответа
Я наконец получил функциональный ответ от поддержки Honeywell:
Я подозреваю, что приложение хочет получить данные в виде событий Keydown / Keyup.
Можете ли вы проверить следующее?
На клине в качестве ключей установлено: 9,10,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
Поскольку это может занять 15 минут, чтобы сделать это вручную, я создал этот код, который вы можете прочитать внутри поля Клин как ключи:
После прочтения кода, пожалуйста, подождите 10 секунд перед сохранением и проверьте, правильно ли сохранены данные в этом поле, выйдя и повторно войдя в настройки сканера.
Наконец, отключите и снова включите сканер (или перезагрузите устройство).
Затем сканер должен работать с вашим приложением.
Надеюсь это поможет.
Терминал должен использовать последнюю версию системы, чтобы увидеть поле "Клин как ключи". Не забудьте установить "\n" в качестве суффикса.
При этом код JS будет:
var BarcodesScanner = {
barcodeData: '',
deviceId: '',
symbology: '',
timestamp: 0,
dataLength: 0
};
function onScannerNavigate(barcodeData, deviceId, symbology, timestamp, dataLength){
BarcodesScanner.barcodeData = barcodeData;
BarcodesScanner.deviceId = deviceId;
BarcodesScanner.symbology = symbology;
BarcodesScanner.timestamp = timestamp;
BarcodesScanner.dataLength = dataLength;
$(BarcodesScanner).trigger('scan');
}
BarcodesScanner.tmpTimestamp = 0;
BarcodesScanner.tmpData = '';
$(document).on('keypress', function(e){
e.stopPropagation();
var keycode = (e.keyCode ? e.keyCode : e.which);
if (BarcodesScanner.tmpTimestamp < Date.now() - 500){
BarcodesScanner.tmpData = '';
BarcodesScanner.tmpTimestamp = Date.now();
}
if (keycode == 13 && BarcodesScanner.tmpData.length > 0){
onScannerNavigate(BarcodesScanner.tmpData, 'FAKE_SCANNER', 'WEDGE', BarcodesScanner.tmpTimestamp, BarcodesScanner.tmpData.length);
BarcodesScanner.tmpTimestamp = 0;
BarcodesScanner.tmpData = '';
} else if (e.charCode && e.charCode > 0) {
BarcodesScanner.tmpData += String.fromCharCode(e.charCode);
}
});
Теперь вы можете прослушать событие сканирования:
$(BarcodesScanner).on('scan', function(e){
alert(BarcodesScanner.barcodeData);
});
Я надеюсь, что это поможет кому-то еще.
Вы пытались подписаться на разные элементы $('html,body') и, возможно, разные события keyup, keydown, textInput?
И вы используете мобильный или JQuery нормальный?
Изменение набора ключей и использование суффикса \n работает для Android4.4. Это не работает на Android 6.0.1. Тестирование на Dolphin CT50...
У Honeywell есть решение этой проблемы, вам понадобится этот файл: HELSINKIAD_71.01.07.0050
спросите honeywell, после этого вы обновляете его через режим восстановления..