OnKeyDown
OnKeyUp
Технические вопросы
7.x

Отследить нажатие Enter в текстовом поле, для вызова своего метода. BpmOnline 7.5.

Здравствуйте.

Подскажите, как использовать события нажатия кнопок в текстовом поле.
Объявлено текстовое поле:

//diff
{
"operation": "insert",
"parentName": "Header",
"propertyName": "items",
"name": "Surname",
"values": {
   "layout": { "column": 0, "row": 0, "colSpan": 7},
   "bindTo": "Cyr_Surname",
    "contentType": Terrasoft.ContentType.TEXT,
    "caption": {"bindTo": "Resources.Strings.Cir_SurnameCaption"}
}
}

attributes: {
   "Surname": {
    dataValueType: Terrasoft.DataValueType.TEXT
    }
}

Как обратиться к событиям OnKeyUp, OnKeyDown? В итоге должно получиться: Пользователь вводит текст, нажимает Enter, выполняется моя функция.

Нравится

9 комментариев

Олег, если правильно понимаю, то вот здесь - http://www.community.terrasoft.ru/forum/topic/11415 подобное уже обсуждалось.

Здравствуйте, Илья.
Сделал как сказано в указанной ссылке. Выходит ошибка в консоль: "TypeError: a.target is null" И соответственно не работает.

Вот, что написал:

[javascript]
init: {

var map = new Ext.util.KeyMap({
target: "RIBClientSearchPageCyr_SurnameTextEdit-el",
key: 13, // or Ext.EventObject.ENTER
scope: this,
binding: map,
fn: this.OnMyPressEnter
});

this.callParent(arguments);

}

onMyPressEnter: function(args) {
this.showInformationDialog("Test");
if (this.keyMap) {
this.keyMap.destroy();
this.keyMap = null;
}
},
[/javascript]

Подскажите, что не так. Спасибо.

На момент начала события init, Ext компоненты(текстовое поле) еще нет, делайте так:

[javascript]
onEntityInitialized: function() {
this.callParent(arguments);

var map = new Ext.util.KeyMap({
target: "AccountPageV2CodeTextEdit-el",
key: Ext.EventObject.ENTER,
fn: this.myHandler,
scope: this
});
},
myHandler: function() {
alert("ENTER");
},
[/javascript]

То есть, инициализируйте подписку в функции onEntityInitialized

Сделал в onEntityInitialized. На нажатие ENTER среагировал новой ошибкой. В консоле: message: TypeError: k is undefined в файле all-combined.js Нашел функцию в all-combined.js, в которой вызывается ошибка. В строке if (k.call(l, h, a) !== true && b).

[javascript]
processEvent: Ext.identityFn,
processBinding: function(g, a) {
if (this.checkModifiers(g, a)) {
var h = a.getKey(), k = g.fn || g.handler, l = g.scope || this, j = g.keyCode, b = g.defaultEventAction, c, e, d = new Ext.EventObjectImpl(a);
for (c = 0,
e = j.length; c < e; ++c) {
if (h === j[c]) {
if (k.call(l, h, a) !== true && b) {
d[b]()
}
break
}
}
}
},
[/javascript]

Чего-то не хватает еще.

Листинг своего кода напишите, и раздел в который добавили его напишите. Если поле стандартное, то тоже стоит указать, попробуем воспроизвести на аналогичных условиях.
Но вероятно хватит и листинга что бы понять в чем проблема.

Ребят, спасибо разобрался. Подвожу итог:

[javascript]
onEntityInitialized: function() {
this.callParent(arguments);

var keyMap = new Ext.util.KeyMap({
target: "RIBClientSearchPageCyr_SurnameTextEdit-el",
key: Ext.EventObject.ENTER,
fn: this.onMyPressEnter,
scope: this,
binding: keyMap
});
},

onMyPressEnter: function() {
this.showInformationDialog("Test");
},
[/javascript]

И все работает.

Разумеется, javascript то case sensitive, а k = g.fn андефайнд должен был намекнуть что функцию не находит. А не находило ее ибо регистр первой буквы был разный :wink:

Все так, все так :-)

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

[javascript]
onEntityInitialized: function() {
this.callParent(arguments);

this.keyMap = null;

var map = new Ext.util.KeyMap(Ext.getBody(), [{
key: Ext.EventObject.ENTER,
fn: this.onMyPressEnter,
scope: this,
binding: map
}]);

this.keyMap = map;

},

onMyPressEnter: function() {
this.showInformationDialog("Test");

//Функция выполнится один раз. Нужно использовать при переходе по процессу
if (this.keyMap) {
this.keyMap.destroy();
this.keyMap = null;
}
},
[/javascript]

Показать все комментарии