Использование JavaScript и XHTML: открытие / отправка XMLHttpRequest не работает, если до onreadystatechange - PullRequest
2 голосов
/ 14 октября 2010

Я не знаю, работает ли он или нет, но я заканчиваю это, потому что код, размещенный здесь, работает (за исключением того, что находится в цикле for (тупой DOM), но это не фокус) ТОЛЬКО после двух щелчки. Я предполагаю, что это потому, что он не получает документ XML, пока он не создан, что находится в конце первого клика.

Однако, если бы я поместил методы XMLhttpRequest.open и XMLHttpRequest.send ДО функции onreadystatechange, код не будет выполняться внутри вложенного оператора if (который проверяет состояние чтения / состояния). Я проверил это с предупреждением или document.write.

Есть идеи, что не так?

if (window.XMLHttpRequest)
{
    var xmlhttp = new XMLHttpRequest();
}

function lessonList()
{   
    var xmldoc = xmlhttp.responseXML;

    xmlhttp.onreadystatechange = function() 
    {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
            var getTitle = xmldoc.getElementsByTagName('title');
            var lessonList = document.getElementById('lesson-list');

            for (i = 0; i < getTitle.length; i++)
            {
                var lessonTitle = document.createElement('li');
                lessonTitle.nodeValue = getTitle[i].childNodes[0].nodeValue;

                lessonList.appendChild(lessonTitle);
            }
        }
    };

    xmlhttp.open("GET", 'file.xml', true);
    xmlhttp.send(null);
}

Ответы [ 2 ]

3 голосов
/ 14 октября 2010

+ 1 ответ идеальной машины. Для пояснения, не существует ни одного отдельного экземпляра Document, связанного с единственным XMLHttpRequest, где загрузка XML из ответа просто обновляет содержимое документа. Это не как звонить Document.load().

Вместо этого при отправке запроса объект XMLHttpRequest удаляет старый Document, на который ссылается его responseXML, и при получении ответа создает новый экземпляр Document с ответом. Если вы сохранили ссылку на старое значение responseXML, это все еще допустимый Document, но это старый XML-документ из предыдущего ответа, а не новый.

Кроме того, помните свой var i в цикле for, чтобы избежать случайного глобала. И установка nodeValue не имеет смысла для узла Element; вам нужно будет document.createTextNode(string) и добавить его вместо.

Обычно вы будете использовать вспомогательную функцию для получения / установки текстового содержимого элемента, так как традиционная DOM делает это такой болью. Свойство DOM Level 3 Core element.textContent - это простой способ, но его нет в IE или некоторых старых браузерах.

3 голосов
/ 14 октября 2010

Происходит следующее: когда вы нажимаете кнопку во второй раз, это «успешно», потому что она использует ответ от первого щелчка. Он не работает в первый раз, потому что код пытается получить ссылку на XML-документ до того, как загрузится, поэтому xmldoc фактически является нулевым, а не желаемым ответом сервера. Вам нужно переместить строку var xmldoc = xmlhttp.responseXML; во внутреннюю функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...