Захват событий считывателя штрих-кода (клавиатура-клин) из 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 минут, чтобы сделать это вручную, я создал этот код, который вы можете прочитать внутри поля Клин как ключи:

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

После прочтения кода, пожалуйста, подождите 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, после этого вы обновляете его через режим восстановления..

Другие вопросы по тегам