为什么在ExtJs 4.1.3中,textfield id与IE中的监听器冲突?
问题描述:
我们的应用程序使用ExtJs和版本4.1.3奇怪的行为正在IE中显示。为什么在ExtJs 4.1.3中,textfield id与IE中的监听器冲突?
问题是,如果我们打开窗口的窗体只有少量文本框/组合框,并且在关闭一次后重新打开此窗口,则应用于文本框/组合框的焦点/模糊侦听器将停止工作。
以下是对这一问题的测试用例:
Ext.onReady(function(){
function getForm(){
var form = {
xtype:'form',
width:550,
items:[
{
xtype:'textfield',
flex:1,
fieldLabel:'test1',
id:'disabledFieldId',
itemId:'disabledFieldId',
listeners:{
focus:function(){
console.log('focus first field');
},
blur:function(){
console.log('blur first field');
},
change:function(){
console.log('change first field');
}
}
},
{
xtype:'textfield',
flex:1,
fieldLabel:'test2'
}
]
};
return form;
}
Ext.create('Ext.Button', {
text: 'Open Window',
renderTo: Ext.getBody(),
handler: function() {
var win = Ext.create('Ext.window.Window',{
modal:true,
items:[
getForm()
],
width:550,
height:200
});
win.show();
}
});
});
在上面的测试情况下,这个问题可以通过以下步骤进行检查:
加载网页在IE和点击“打开窗口”按钮打开窗口
单击第一个文本框来关注它,这将打印一个语句 - “首先关注焦点场” - 在控制台
现在再次从按钮,在第一文本框关闭此窗口,然后打开它
点击 - 现在,什么都不会被打印到控制台 - 焦点事件不会在所有火。
我已检查并发现'焦点'和'模糊'事件不会触发,但'更改'事件每次都会触发。
如果我们重新加载整个页面,然后打开窗口,那么事件将再次开始触发。但在这种情况下,也只有一次。
我发现如果'id'是从textfield注释,那么事情开始工作正常。但是这很奇怪。 'id'如何与听众冲突?这是一个错误?
请注意,没有错误被抛出。此外,窗口正在被破坏,元素正在重新创建。
我在Chrome和Firefox中也测试了这一点,并发现这种行为仅在IE中发生(在IE9中以文档和浏览器模式设置为标准进行检查)。
另外,当我测试版本高达4.1.1,我发现事情与IE浏览器也能正常工作。
对这个人有什么想法?
感谢您的帮助。
我不知道为什么,但我可以给你一个修复:设置属性CloseAction'隐藏',以防止DOM破坏然后用按钮不创建窗口,但显示并创建页面加载 – Vogel612 2013-02-27 13:40:27
@ Vogel612:谢谢但隐藏会在我们的应用程序中创建许多新问题,所以不能这样。 – netemp 2013-02-27 13:42:46
好吧,这与我的问题有关,但我想你是对的。需要从头开始了解使用哪种机制。顺便问一下,你确定你不能通过两次点击按钮来创建两个窗口?只要设置了id,监听器的id将只能在第一次提到id时使用,与类 – Vogel612 2013-02-27 13:49:06