Ошибка XMLHttpRequest (Ajax)
У меня ошибка xmlhttprequest при работе с javascript. У меня есть XML файл, который я бы хотел разобрать и присвоить его содержимому на веб-странице. Я проделал свое исследование по этой части, и я не могу понять это.
<script = "text/javascript">
window.onload = onPageLoad();
var questionNum = 0;
function onPageLoad(questionNum){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","quiz.xml");
try{
xmlhttp.send(null);//here a xmlhttprequestexception number 101 is thrown
}catch(err){
document.getElementById("body").innerHTML += "\nXMLHttprequest error: " + err.description;
//this prints "XMLHttprequest error: undefined" in the body.
}
xmlDoc=xmlhttp.responseXML;
parser=new DOMParser(); //this code is untested as it does not run this far.
}
</script>
Мой XML файл прост и находится внутри одного и того же каталога.
<question>
<query>what is 2+2?</query>
<option>4</option>
<option>5</option>
<option>3</option>
<answer>4</answer>
</question>
Я не могу понять, в чем моя проблема. Для справки я обычно программирую на С# или Java, и я использую google chrome.
Ответы
Ответ 1
Таким образом, здесь может быть несколько ошибок.
Сначала начните читать, как использовать XMLHttpRequest.open()
, потому что есть третий необязательный параметр для указания, нужно ли делать асинхронный запрос, по умолчанию - true. Это означает, что вы делаете асинхронный запрос и вам нужно указать функцию обратного вызова, прежде чем вы выполните send()
. Здесь пример из Mozilla Developer Network:
var oXHR = new XMLHttpRequest();
oXHR.open("GET", "http://www.mozilla.org/", true);
oXHR.onreadystatechange = function (oEvent) {
if (oXHR.readyState === 4) {
if (oXHR.status === 200) {
console.log(oXHR.responseText)
} else {
console.log("Error", oXHR.statusText);
}
}
};
oXHR.send(null);
Во-вторых, поскольку вы получаете ошибку 101, у вас может быть неправильный URL. Поэтому убедитесь, что URL-адрес, с которым выполняется запрос, правильный. Также убедитесь, что ваш сервер способен обслуживать ваш файл quiz.xml
.
Вероятно, вам придется отлаживать, упрощая/сужаясь, где проблема. Поэтому я начал бы с простого синхронного запроса, чтобы вы не беспокоились о функции "функции обратного вызова". Итак, вот еще один пример из MDN для синхронного запроса:
var request = new XMLHttpRequest();
request.open('GET', 'file:///home/user/file.json', false);
request.send(null);
if (request.status == 0)
console.log(request.responseText);
Кроме того, если вы только начинаете с Javascript, вы можете обратиться к MDN для документации/примеров/руководств API Javascript.
Ответ 2
Я вижу две возможные проблемы:
Проблема 1
- объект XMLHTTPRequest не завершил загрузку данных в то время, когда вы пытаетесь его использовать.
Решение:
назначить функцию обратного вызова объектам "onreadystatechange" -event и обрабатывать данные в этой функции
xmlhttp.onreadystatechange = callbackFunctionName;
Как только состояние достигло DONE (4), содержимое ответа готово к чтению.
Проблема 2
- объект XMLHTTPRequest не существует во всех браузерах (с помощью этого имени)
Решение:
Или используйте try-catch для создания правильного объекта для корректного браузера (ActiveXObject в IE) или используйте фреймворк, например jQuery ajax-method
Примечание. Если вы решили использовать jQuery ajax-метод, вы назначаете функцию обратного вызова с помощью jqXHR.done()
Ответ 3
Проблема, скорее всего, будет связана с линией
window.onload = onPageLoad();
Bby, включая скобки, которые вы говорите, должен быть равен возврату onpPageLoad(). Например:
/*Example function*/
function onPageLoad()
{
return "science";
}
/*Set on load*/
window.onload = onPageLoad()
Если вы распечатаете значение window.onload на консоли, это будет наука.
Решение состоит в том, чтобы изменить линию на
window.onload = onPageLoad;
Наконец
Чтобы получить значение ответа, вам понадобится функция readystatechange для вашего объекта xmlHttp, например вместо
xmlDoc=xmlhttp.responseXML;
parser=new DOMParser(); //this code is untested as it does not run this far.
вы можете использовать
xmlHttp.onreadystatechange = function()
{
if(this.readyState == 4){
//Do your thing
}
}