19.04.2015, 00:34
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Component Focus & Blur
Здравствуйте!
Почему если вызвать метод component.focus() не генерируется событие focus у этого компонента?
Или как пользоваться этими событиями и методами компонент: Focus & Blur?
|
|
19.04.2015, 12:43
|
Профессор
|
|
Регистрация: 19.11.2012
Сообщений: 178
|
|
странно, конечно, но в документации написано, что вызов focus() приводит к генерации события tofront.
http://docs.sencha.com/extjs/5.1/5.1...t-method-focus
А пользоваться так. Нужно в определении компонента написать свою реализацию шабонного метода postFocus или postBlur:
/**
* Template method to do any post-focus processing.
* @protected
* @param {Ext.event.Event} e The event object
*/
postFocus: Ext.emptyFn,
http://docs.sencha.com/extjs/5.1/5.1...thod-postFocus
Хотя лично у меня нет опыта работы с postFocus. Напишите, помогло ли это решение.
|
|
19.04.2015, 21:24
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Странно то, что события tofront тоже вроде как нет. По крайней мере по документации.
Писать методы post* страннно как-то...
Я думал как использовать: Если я выделил объект на экране, то он в фокусе. Если я выделил какой другой объект и вызвал у него метод focus, то предыдущий объект тут же теряет фокус. Это удобно тем, что мне не нужно специально искать какой же объект сейчас в фокусе, снимать с него фокус и ставить фокус на объект, который сейчас пытаемся выделить.
Я думал что такая стандартная функция уже реализована...
Похоже придется дописать эту функцию... для всех компонент. Надеюсь без override.
|
|
19.04.2015, 23:30
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Попробовал эту штуку
To activate the FocusManager, simply call Ext.FocusManager.enable();. In turn, you may deactivate the FocusManager by subsequently calling Ext.FocusManager.disable();. The FocusManager is disabled by default.
http://docs.sencha.com/extjs/5.1/5.1...-method-enable
Но к сожалению на строке Ext.FocusManager.enable(); выдает ошибку. В чем там проблема пока не ясна, уж больно велик стек))))
|
|
19.04.2015, 23:35
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Нашел способ вставки команды. Если так записать, то ошибки уже нету:
Ext.onReady(function() {
Ext.FocusManager.enable();
...
Но к сожалению это ничего не дало. События focus|blur не появляются.
|
|
20.04.2015, 00:15
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Нашел опцию
http://docs.sencha.com/extjs/5.1/5.1...erty-focusable
Поставил в своих компонентах равной true.
И снова не работает...
Что еще нужно сделать, чтобы этот механизм троклятый заработал?
|
|
20.04.2015, 00:57
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Вот пример https://fiddle.sencha.com/#fiddle/lgf
console.clear();
Ext.FocusManager.enable(true);
Ext.define("MyComponent", {
extend: "Ext.Component",
focusable: true
});
var comp = Ext.create("MyComponent", {
renderTo: Ext.getBody(),
html: "Тестовый компонент"
});
comp.on("focus", function() {
console.log("FOCUS");
});
comp.on("blur", function() {
console.log("BLUR");
});
comp.focus();
comp.blur();
Пока это дело не работает.
Может из-за того, что элементом компонента является DIV?
|
|
20.04.2015, 08:39
|
Профессор
|
|
Регистрация: 19.11.2012
Сообщений: 178
|
|
Да, точно. Нужно ещё писать focusable.
Ext.application({
name : 'Fiddle',
launch : function() {
Ext.define("MyComponent", {
extend: "Ext.Component",
focusable: true,
onFocus: function() {
alert(1);
this.callParent(arguments);
},
postFocus: function() {
alert(2);
}
});
var comp = Ext.create("MyComponent", {
renderTo: Ext.getBody(),
html: "Тестовый компонент"
});
comp.focus();
}
});
фидл
|
|
20.04.2015, 09:59
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
1) Не работает. Алерты не всплывают. У вас этот пример что, работающий?
2) И самого главного нет - генерации событий focus|blur!
|
|
20.04.2015, 10:04
|
|
Соединяю Node.js и Ext JS
|
|
Регистрация: 25.06.2009
Сообщений: 1,033
|
|
Так... я подставил вместо DIV тег INPUT и все заработало. Оказывается целевой элемент должен поддерживать focus/blur. DIV не может быть фокусируемым, а вот INPUT может. Теперь ясно в чем проблема... Правда не ясно что делать, если у меня компонент допустим окно. Оно ведь на DIV-ах построено же... Есть ли какой-нибудь безобидный тег, поддерживаемый focus/blur?
|
|
|
|