我将虚拟键盘从http://www.greywyvern.com/code/javascript/keyboard添加到extjs 4.2表单的文本字段中。
它基本上有效,请看这里:http://jsfiddle.net/g5VN8/1/
1)我的第一个问题是:这真的是连接它们的最佳方式吗?用计时器代替事件看起来很难看,以使extjs值保持最新状态。
另外,我无法克服以下两个问题:
2)键盘图标被换行到新行。它应该在字段的末尾,在右侧,就像在这里的示例中一样:http://www.greywyvern.com/code/javascript/keyboard
3)场焦点不起作用。我有一个节目听众。即使在window.setTimeout()中包含它也不起作用,所以它不是时间问题。没有错误。
这是一个复制粘贴(stackoverflow的规则)。我会保持两个地方都是最新的。
Ext.onReady(function() {
Ext.QuickTips.init();
var formPanel = Ext.create('Ext.form.Panel', {
renderTo: Ext.getBody(),
bodyStyle: 'padding: 5px 5px 0 5px;',
defaults: {
anchor: '100%',
},
items: [{
xtype:'textfield',
name: 'string',
fieldLabel: 'String',
maxLength:30, enforceMaxLength:true,
allowBlank: false,
listeners: {
show: function(field) {
//focus the field when the window shows
field.focus(true, 1000); //TODO: doesn't work, no error
},
afterrender:function(cmp){
cmp.inputEl.set({ //see http://jsfiddle.net/4TSDu/19/
autocomplete:'on'
});
//attach the keyboard
//because it modifies the dom directly we need to hack it to
//inform extjs (really, ext has no such listener option?)
var interval = window.setInterval(function() {
try {
var newValue = cmp.inputEl.dom.value;
var oldValue = cmp.getValue();
if (newValue != oldValue) {
//only do it then, cause it also moves the cursor
//to the end and that sucks.
cmp.setValue( newValue );
}
} catch (e) {
//form was removed
window.clearInterval(interval);
}
}, 100);
// see http://www.greywyvern.com/code/javascript/keyboard
VKI_attach(cmp.inputEl.dom);
}
}
}],
buttons: [{
text: 'Alert string',
handler: function() {
var stringField = this.up('form').getForm().findField('string');
alert(stringField.getValue());
}
}]
});
});
答案 0 :(得分:0)
您可以将监听器附加到键盘,当用户单击VKI键时,您将触发文本字段更改事件。
Ext.getBody().on({
mousedown: function (ev) {
if (ev.target.tagName === 'TD') {
// We trigger change event only on textfield with the focus
if (document.activeElement) {
if (document.activeElement.id === cmp.inputEl.dom.id) cmp.fireEvent('change');
}
}
},
delegate: '#keyboardInputMaster'
});
这是因为ExtJS 4使用“style = width:100%”写入输入字段。 一种简单的方法是在文本字段中添加负边距
fieldStyle: 'margin-right:-40px'
奇怪的ExtJS行为。您必须聚焦输入元素,而不是textfield组件
Ext.defer(function () {
cmp.inputEl.dom.focus();
}, 100);
您可以在此处查看整个解决方案:http://jsfiddle.net/EGbLn/3/
答案 1 :(得分:0)
避免使用计时器。请改用常规dom事件侦听器。
afterrender: function (cmp) {
...
// simply attach this to the change event from dom element
cmp.inputEl.dom.addEventListener('change', function(){
cmp.setValue(this.value);
});
...
}
(已由Samy Rancho回答)
fieldStyle: 'margin-right:-40px',
再次,避免使用计时器和任何类似的东西。只需添加:
afterrender: function (cmp) {
...
//focus on field
cmp.inputEl.dom.focus();
...
}
在此处查找更新的小提琴:http://jsfiddle.net/g5VN8/11/