#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