Ext.FocusManager
Куда подевался Ext.FocusManager?
Как теперь понять, на чем фокус стоит? Как отслеживать перемещение фокуса? |
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('компонент потерял фокус'); }); Очень надеюсь, что менее тривиальные случаи вас не побеспокоят. ;) |
focusenter мне не поможет отследить фокус.
Потому что component не известен. И собственно отслеживание фокуса нужно как раз для того, чтобы узнать component, на котором фокус. Вот это Ext.ComponentManager.getActiveComponent(); конечно уже лучше. Но как отследить изменение фокуса? Хотя можно по идее делать по цепочке. 1) узнать текущий фокус Ext.ComponentManager.getActiveComponent(); 2) подписаться на focusleave 3) как только происходит focusleave тут же перейти в пункт 1. Муторный способ однако... |
Объясните подробнее, чего хотите добиться.
|
Хочу отслеживать фокус. Например, при смене фокуса, чтобы в консоли появлялось сообщение: фокус изменен с компонента1 на компонент2
|
Отслеживание фокуса само по себе особого смысла не имеет, только если из праздного любопытства. Скорее всего вам это нужно для каких-то конкретных целей, например валидирования данных в форме или ещё чего-нибудь. Вот это я и пытаюсь выяснить: какова ваша задача, в чём цель отслеживания фокуса?
Это я не педантизма ради, просто accessibility в целом и управление фокусом в частности это как раз одно из моих основных направлений работы в Sencha. Я могу вам подсказать, как сделать то или это, но мне нужно понимать, чего вы хотите добиться, чтобы посоветовать оптимальный вариант. |
Вы наверное все секреты можете выведать. Да, мне нужно прикрутить чертов сканер штрих-кодов к браузеру. Таблицы grid к сожалению не пропускают пробелы и Enter-ы. Вот сижу и думаю как бы эту неприятность обойти.
|
Мне ваши секреты ни к чему, правда. :) Но я рад, что мы постепенно продвигаемся к цели.
Grid не "не пропускает" пробелы и Enter, эти клавиши имеют специальное значение. Пробел выделяет строку или ячейку, Enter переводит таблицу из навигационного режима (Navigable mode) в активизационный режим (Actionable mode). Названия и поведение таблицы взяты прямиком отсюда: https://www.w3.org/TR/wai-aria-practices/#grid. Изменять это поведение в общем случае я бы не рекомендовал, но если есть чёткое понимание, как UI должен работать, то можно сделать исключение. Хотя и непонятно пока, зачем. Вам нужно со сканера данные получать и вставлять в таблицу? В этом случае можно не обращать внимание на фокус и просто добавлять записи в Store. Grid знает, что нужно делать, когда в нём сфокусирована ячейка и надо обновить таблицу. Или задача в чём-то ещё? |
Сканер отправляет строку с префиксом и постфиксом. В качестве постфикса используется код 13 Enter. И если случайно (пользователь все может) фокус будет на каком-либо гриде, то 13-й код не пройдет и штрих-код не будет считан (точнее его конец не будет считан).
У меня работа со сканером глобальная. То есть не привязана ни к какому элементу. Поэтому пользователю не требуется перед сканированием указывать фокус (то есть специально выбирать элемент, куда будет произведен ввод со сканера). |
А какой префикс? И вообще, какие символы приходят со сканера и сколько?
|
Часовой пояс GMT +3, время: 23:24. |