IE: почему HTML-результат AJAX не обновляется в DOM?

Я загружаю HTML-контент через ajax в div (используя mootools 1.11 и сжатие, если это имеет значение).
В загружаемом контенте у меня есть JS, который манипулирует некоторыми загруженными объектами HTML.
Все работает. нормально в FF, но когда я загружаю его в IE (проверено на IE7 на данный момент), код завершается с ошибкой: «'null' является нулевым или не является объектом.
Быстрый тест показывает, что новые элементы, загруженные AJAX, не находятся в DOM IE. Загрузил div с идентификатором "test", и когда я запустил document.getElementById('test'), я получил null. Излишне говорить, что запуск getElementById для исходных элементов работает нормально.

Кто-нибудь знает, как решить/обойти эту проблему?

Еще немного информации: я поместил свой код в окно «domready». Пытался использовать событие «загрузить», но IE никогда его не вызывал.

UPDATE
как и советовали, я проверил тот же скрипт на IE8 с лучшими возможностями отладки.
Похоже, проблема действительно во времени. Я запускаю свой код в окне domReady, и кажется, что он запускается мгновенно, не дожидаясь готовности DOM (во всплывающем окне). Запуск того же скрипта с помощью отладчика после загрузки всей страницы без проблем находит элементы.
Итак, я думаю, теперь вопрос заключается в том, как заставить скрипт запускаться в нужное время.

  • событие domready, кажется, срабатывает задолго до того, как дом будет готов
  • событие загрузки, похоже, вообще не срабатывает
  • размещение скрипта в конце файла после объектов HTML также не помогает
  • В параметрах Mootools AJAX я указываю «evalScripts» как true, иначе скрипт вообще не запускается.

Любые идеи?


person Omer    schedule 17.10.2009    source источник
comment
Используете ли вы какую-либо JS-библиотеку (jQuery, Dojo и т. д.) или сами пишете старый добрый JS?   -  person Arve Systad    schedule 17.10.2009
comment
Как вы добавляете полученное содержимое в div -- устанавливаете атрибут innerHTML div или как еще...?   -  person Alex Martelli    schedule 17.10.2009
comment
Я использую Squeezebox. Из беглого взгляда на код я думаю, что он использует mootools .setHTML()   -  person Omer    schedule 17.10.2009


Ответы (5)


ничто не мешает IE загружать элементы в дом. также нет такой вещи, как «domready» после обновления свойства innerHTML. учти это:

new Ajax("someurl", {
    method: "get",
    evalScripts: true,
    onComplete: function() {
        $("someid").setHTML(this.response.text); // load content.
    }
}).request();

теперь вопрос в том, запускается ли evalScripts ДО onComplete или после. Я так понимаю, сценарий, который вы отправляете обратно, имеет отношение к разметке, которую вы используете для обновления?

исходный код для 1.11 идет:

onComplete: function(){
    if (this.options.update) $(this.options.update).empty().setHTML(this.response.text);
    if (this.options.evalScripts || this.options.evalResponse) this.evalScripts();
    this.fireEvent('onComplete', [this.response.text, this.response.xml], 20);
},

что указывает на то, что сценарии оцениваются после обновления: и до onComplete, поэтому с помощью:

update: $('somediv'),
evalScripts: true

должен работать. если это не так, то я бы предложил попробовать:

new Ajax("someurl", {
    method: "get",
    onComplete: function() {
        $("someid").setHTML(this.response.text); // load content.
        this.evalScripts(); 

        // or if it fails still, delay it:
        /*
        if (window.ie)
        (function() {
            this.evalScripts();
        }).delay(100, this);
        */
    }
}).request();
person Dimitar Christoff    schedule 18.10.2009
comment
это было все. Фактический код использовался для удаления «evalScripts: true» из параметров ajax, отправленных в поле Squeeze, и замены его на: «onComplete: function (result) {this.evalScripts();}». Спасибо. - person Omer; 18.10.2009

Вы можете протестировать IE8 и использовать инструменты веб-разработчика IE, чтобы увидеть, что происходит на самом деле, чтобы увидеть, не произошла ли где-то ошибка.

Вы также можете получить этот плагин для IE7, хотя я помню, что он был улучшен для IE8.

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

person James Black    schedule 17.10.2009
comment
Я последовал вашему совету, и это действительно помогло сузить проблему. См. обновление в теле вопроса. - person Omer; 18.10.2009

Некоторые тестовые идеи: - Пробовали ли вы использовать старые модные методы xmlHttpRequest, чтобы проверить, работает ли он без фреймворков? - Проверьте свой документ DOCTYPE, возможно, у вас есть проблемы с типом содержимого html/xml, которые затрагивают только IE. - Вы уверены, что объект, которым вы пытаетесь манипулировать, уже существует, когда вы к нему обращаетесь? IE намного медленнее, чем FF. - Пробовали ли вы использовать какие-то другие методы AJAX или манипуляции с DOM, чтобы увидеть, может быть, проблема менее специфична? - Вы проверили правильность HTML? возможно, у вас есть неверный HTML-код, который FF может анализировать, а IE - нет.

person Tombigel    schedule 17.10.2009
comment
На данный момент я могу сказать, что: - HTML-код действителен - Вы правы в том факте, что объект не существовал во время запуска скрипта. Пожалуйста, смотрите обновления в теле вопроса. - person Omer; 18.10.2009

Что бы это ни стоило, вот версия прототипа Димитара Кристоффа с ответ:

new Ajax.Request('someurl', {
  parameters: param,
  onComplete: function(transport) {
    /* eval scripts first */
    transport.responseText.evalScripts();

    /* rest of onComplete code */
    /* ... */
  }
});

Это гарантирует, что встроенные сценарии оцениваются перед выполнением остальной части обратного вызова onComplete (что, начиная с Prototype 1.7.1, НЕ является поведением по умолчанию).

person Niko    schedule 17.12.2013

Могут быть некоторые проблемы с перекосом версий — текущий squeezebox требует mootools 1.2 (и больше не использует setHTML, cfr здесь для проблем с другим инструментом); вы уверены, что ваши сжатия и mootools находятся в совместимых версиях (и полностью поддерживают IE)? Возможно, простое обновление до последней версии решит вашу проблему (стоит попробовать!).

person Alex Martelli    schedule 17.10.2009
comment
спасибо, но я на Joomla 1.5, так что а. Я знаю, что Squeezebox и Mootools совместимы (они поставляются при установке) и b. Я не могу обновить ни один из них, не взломав ядро ​​Joomla. - person Omer; 17.10.2009