Тема: Ext.FocusManager
Показать сообщение отдельно
  #13 (permalink)  
Старый 23.05.2016, 22:53
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Сообщение от khusamov Посмотреть сообщение
У меня работа со сканером глобальная. То есть не привязана ни к какому элементу. Поэтому пользователю не требуется перед сканированием указывать фокус (то есть специально выбирать элемент, куда будет произведен ввод со сканера).
Всё страньше и страньше, сказала Алиса... Т.е. у вас общение со сканером односторонее и по факту сканер эмулирует клавиатурный ввод на уровне ОС в активное приложение? А что будет, если окно браузера не в фокусе и "нажатия клавиш" улетят мимо?

Хм. Если подумать, то задачка-то забавно нетривиальная даже без учёта вопроса с браузерным окном. Отслеживание активного компонента тут слабо поможет, особенно если вашему приложению нужно работать в IE. Я бы пошёл другим путём: можно установить обработчик события keydown на уровне документа со срабатыванием в фазе перехвата, и при опознавании префикса "подставлять" под следующие за ним "нажатия клавиш" некое специальное поле. Примерно так:

Ext.define('My.app.Application', {
    extend: 'Ext.app.Application',

    launch: function() {
        this.scannerField = new Ext.form.field.Text({
            renderTo: Ext.getBody(),
            floating: true,
            hidden: true,
            focusOnToFront: true,
            cls: 'x-hidden-clip',
            shadow: false,
            listeners: {
                specialkey: function(field, e) {
                    
                    if (e.getKey() === e.ENTER) {
                        e.preventDefault();
                        e.stopEvent();
                        
                        // Это просто чтобы не заморачиваться с разрешением
                        // scope через references в этом примере
                        Ext.app.Application.instance.fireEvent('scanner_input', this.getValue());
                        this.setRawValue('');
                        this.hide();
                    }
                }
            }
        });
        
        Ext.getDoc().on('keydown', function(e) {
            // 52 это код клавиши для '$'
            if (e.getKey() === 52) {
                e.preventDefault();
                e.stopEvent();
                Ext.app.Application.instance.scannerField.show();
                return false;
            }
        }, { capture: true });
    }
});


Это решение не на 100% свободно от побочных эффектов, но в вашем случае такого решения скорее всего вообще нет. Для пущего спокойствия душевного, я бы проделал серию бесчеловечных экспериментов над живым сканером; главный вопрос это насколько быстро случается "ввод", т.е. каков разрыв по времени между префиксом и постфиксом. Я очень сильно подозреваю, что разрыв близок к 0 мс, но могут быть варианты. Если разрыв минимален, то вышеописанное решение должно иметь приемлемую надёжность. Я протестировал по-быстрому в Chrome, но по идее в IE тоже должно сработать.

Учтите также, что несмотря на кажущуюся простоту кода, механизмы здесь задействуются сложные и колдунство вельми сильное. Если нужно что-нибудь поменять, лучше сперва спросите. Я с удовольствием объясню, что и как, но это может оказаться надолго. :)
Ответить с цитированием