Почему идентификатор текстового поля конфликтует со слушателями в IE в ExtJs 4.1.3?

Наше приложение использует ExtJs, и в версии 4.1.3 в 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();
        }
    });
});

В приведенном выше тестовом примере эту проблему можно проверить, выполнив следующие шаги:

  1. Загрузите страницу в IE и нажмите кнопку «Открыть окно», чтобы открыть окно.

  2. Щелкните в первом текстовом поле, чтобы сфокусироваться на нем, это напечатает статус - "фокусировать первое поле" - в консоли.

  3. Теперь закройте это окно, а затем снова откройте его с помощью кнопки

  4. Щелкните в первом текстовом поле — теперь ничего не будет выведено на консоль — событие фокуса вообще не сработает.

Я проверил и обнаружил, что события «фокус» и «размытие» не срабатывают, но событие «изменение» срабатывает каждый раз.

Если мы перезагрузим всю страницу, а затем откроем окно сейчас, то события снова начнут запускаться. Но и в этом случае только один раз.

Я обнаружил, что если 'id' прокомментирован из текстового поля, все начинает работать нормально. Но тогда это странно. Как id конфликтует со слушателями? Это ошибка?

Обратите внимание, что никаких ошибок не выдается. Кроме того, окно разрушается, а элементы воссоздаются.

Я также проверил это в Chrome и Firefox и обнаружил, что такое поведение происходит только в IE (проверено в IE9 с режимом документа и браузера, установленным на «Стандарты»).

Кроме того, когда я тестировал это с версиями до 4.1.1, я обнаружил, что с IE все работает нормально.

Есть мысли по этому поводу у кого-нибудь?

Спасибо за помощь заранее.


person netemp    schedule 27.02.2013    source источник
comment
я не знаю почему, но я могу дать вам исправление: установите для свойства CloseAction значение «скрыть», чтобы предотвратить разрушение DOM, затем с помощью кнопки не создавайте окно, а покажите его и создайте его при загрузке страницы   -  person Vogel612    schedule 27.02.2013
comment
@ Vogel612: Спасибо, но скрытие создаст много новых проблем в нашем приложении, поэтому так делать нельзя.   -  person netemp    schedule 27.02.2013
comment
хорошо, это сработало с моей проблемой, но я думаю, вы правы. нужно знать с нуля, какой механизм использовать. кстати, вы уверены, что не можете создать два окна, дважды нажав на кнопку? как только id установлен, несколько слушателей id будут работать только при первом упоминании id, в отличие от классов   -  person Vogel612    schedule 27.02.2013
comment
@ Vogel612: в этом случае мы сделали наше окно модальным, из-за чего кнопку нельзя нажать снова, если окно открыто. Кроме того, если бы это было в случае какого-либо дублирования из-за открытия двух окон, тогда возникла бы ошибка дублирования идентификатора, но ошибки вообще не возникает, и все работает нормально в FF и Chrome, кроме IE.   -  person netemp    schedule 27.02.2013
comment
Я бы не стал назначать идентификаторы в ExtJS, если вам нравится в вашем примере открывать несколько экземпляров, вы можете получить странные вещи. Почему бы вам не использовать name или itemId вместо этого? По какой причине вы используете идентификаторы?   -  person Johan Haest    schedule 27.02.2013
comment
@JohanHaest: Спасибо, но я думаю, хорошо ли использовать «id» или нет, это совсем другой вопрос или предмет для обсуждения. Здесь все работает в IE не так, как в других браузерах, что является проблемой, и при этом не возникает никаких ошибок. Не могли бы вы направить в этом, если это возможно.   -  person netemp    schedule 27.02.2013
comment
Назначение новых слушателей одному и тому же идентификатору по-прежнему будет вызывать проблемы ... Я думаю, что внутри IE запоминает идентификаторы или что-то в этом роде, я не знаю, что происходит под капотом, но он всегда глючит. Так что, если вы не сбросите удостоверение личности, я не смогу вам помочь.   -  person Johan Haest    schedule 27.02.2013
comment
@JohanHaest: Так вы говорите, что IE начал запоминать слушателей с идентификаторами из ExtJs версии 4.1.3? Поскольку все работает нормально для версий до 4.1.1. Похоже, вы упускаете из виду смысл, ЙоханХест. Спасибо за ваше время, хотя до сих пор.   -  person netemp    schedule 27.02.2013


Ответы (1)


Наконец, это было принято как ошибка в версиях 4.1.2 и 4.1.3. Переопределение, которое может решить эту проблему, может быть проверено по этой ссылке.

person netemp    schedule 07.03.2013