Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Ext.FocusManager (https://javascript.ru/forum/extjs/63113-ext-focusmanager.html)

khusamov 18.05.2016 17:37

Ext.FocusManager
 
Куда подевался Ext.FocusManager?
Как теперь понять, на чем фокус стоит?
Как отслеживать перемещение фокуса?

nohuhu 18.05.2016 21:35

Ext.FocusManager убит, расчленён, проткнут осиновым колом в его чёрное сердце, выжжен напалмом, пепел захоронен под Чернобыльским саркофагом, и имя его забыто. Я это сделал собственноручно и с превеликим удовольствием, поэтому как доктор говорю.

Как понять, на чём фокус стоит:

// всегда было
var focusedElement = document.activeElement;

// Вернёт то же самое, если вам так удобнее
focusedElement = Ext.Element.getActiveElement();

// Вернёт компонент, которому принадлежит сфокусированный элемент
// Легко может оказаться null
var focusedComponent = Ext.ComponentManager.getActiveComponent();


Как отслеживать перемещение фокуса... Вот это вопрос на миллион долларов, с радиоактивными тентаклями которого я бодаюсь уже четвёртый год. В тривиальном случае:

component.on('focusenter', function() {
    console.log('компонент сфокусирован');
});

component.on('focusleave', function() {
    console.log('компонент потерял фокус');
});


Очень надеюсь, что менее тривиальные случаи вас не побеспокоят. ;)

khusamov 19.05.2016 13:54

focusenter мне не поможет отследить фокус.

Потому что component не известен. И собственно отслеживание фокуса нужно как раз для того, чтобы узнать component, на котором фокус.

Вот это Ext.ComponentManager.getActiveComponent(); конечно уже лучше. Но как отследить изменение фокуса?

Хотя можно по идее делать по цепочке.
1) узнать текущий фокус Ext.ComponentManager.getActiveComponent();
2) подписаться на focusleave
3) как только происходит focusleave тут же перейти в пункт 1.
Муторный способ однако...

nohuhu 19.05.2016 22:17

Объясните подробнее, чего хотите добиться.

khusamov 20.05.2016 16:15

Хочу отслеживать фокус. Например, при смене фокуса, чтобы в консоли появлялось сообщение: фокус изменен с компонента1 на компонент2

nohuhu 20.05.2016 21:09

Отслеживание фокуса само по себе особого смысла не имеет, только если из праздного любопытства. Скорее всего вам это нужно для каких-то конкретных целей, например валидирования данных в форме или ещё чего-нибудь. Вот это я и пытаюсь выяснить: какова ваша задача, в чём цель отслеживания фокуса?

Это я не педантизма ради, просто accessibility в целом и управление фокусом в частности это как раз одно из моих основных направлений работы в Sencha. Я могу вам подсказать, как сделать то или это, но мне нужно понимать, чего вы хотите добиться, чтобы посоветовать оптимальный вариант.

khusamov 20.05.2016 23:10

Вы наверное все секреты можете выведать. Да, мне нужно прикрутить чертов сканер штрих-кодов к браузеру. Таблицы grid к сожалению не пропускают пробелы и Enter-ы. Вот сижу и думаю как бы эту неприятность обойти.

nohuhu 21.05.2016 01:34

Мне ваши секреты ни к чему, правда. :) Но я рад, что мы постепенно продвигаемся к цели.

Grid не "не пропускает" пробелы и Enter, эти клавиши имеют специальное значение. Пробел выделяет строку или ячейку, Enter переводит таблицу из навигационного режима (Navigable mode) в активизационный режим (Actionable mode). Названия и поведение таблицы взяты прямиком отсюда: https://www.w3.org/TR/wai-aria-practices/#grid. Изменять это поведение в общем случае я бы не рекомендовал, но если есть чёткое понимание, как UI должен работать, то можно сделать исключение. Хотя и непонятно пока, зачем.

Вам нужно со сканера данные получать и вставлять в таблицу? В этом случае можно не обращать внимание на фокус и просто добавлять записи в Store. Grid знает, что нужно делать, когда в нём сфокусирована ячейка и надо обновить таблицу.

Или задача в чём-то ещё?

khusamov 21.05.2016 18:22

Сканер отправляет строку с префиксом и постфиксом. В качестве постфикса используется код 13 Enter. И если случайно (пользователь все может) фокус будет на каком-либо гриде, то 13-й код не пройдет и штрих-код не будет считан (точнее его конец не будет считан).

У меня работа со сканером глобальная. То есть не привязана ни к какому элементу. Поэтому пользователю не требуется перед сканированием указывать фокус (то есть специально выбирать элемент, куда будет произведен ввод со сканера).

Infarch 22.05.2016 13:00

А какой префикс? И вообще, какие символы приходят со сканера и сколько?


Часовой пояс GMT +3, время: 23:24.