Почему определение процесса AJAX завершается неудачей при успешном выполнении тестов?

#ajax

#ajax

Вопрос:

Я разрабатываю игру в стиле риска на основе AJAX, и мой коллега (который с тех пор ушел) написал этот код:

 function init() {
xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","risk.xml",true);
xmlhttp.send(null);
xmldoc=xmlhttp.responseXML;
[snip]
document.getElementById('player').value='red'
[snip]
redterrs=xmldoc.getElementsByTagName('redterrs')[0]
blueterrs=xmldoc.getElementsByTagName('blueterrs')[0]
purpleterrs=xmldoc.getElementsByTagName('purpleterrs')[0]
greenterrs=xmldoc.getElementsByTagName('greenterrs')[0]
  

Когда я пытаюсь выполнить это, я получаю эту ошибку в WebKit: «Неперехваченная ошибка типа: не удается вызвать метод ‘getElementsByTagName’ с нулевым значением» в «redterrs=xmldoc.getElementsByTagName(‘redterrs’)[0]», но когда я делаю это в Firefox с помощью Firebug, он сообщает мне, что xmldoc не определен.

Редактировать: На случай, если кто-то захочет ознакомиться с этим подробнее, project размещен по адресу http://code.google.com/p/risk-board-game .

Ответ №1:

Вы получаете XML-документ асинхронно, но не используете обработчик событий, чтобы узнать, когда был получен XML-документ. Поскольку вы, вероятно, должны делать это синхронно, и поскольку это намного проще, попробуйте это вместо строки 3:

 xmlhttp.open("GET","risk.xml",false);
  

Ответ №2:

если вы используете голый объект XMLHttpRequest, вам необходимо зарегистрировать обратный вызов для onreadystatechange . Это будет запущено по мере прохождения XHR своих состояний.

Что вы делаете неправильно, так это назначение xmldoc для xmlhttp.responseXML вне обратного вызова.

Взгляните на это: http://ajaxpatterns.org/XMLHttpRequest_Call#Asynchronous_Calls