Ошибка XMLHttpRequest (Ajax) - PullRequest
       12

Ошибка XMLHttpRequest (Ajax)

45 голосов
/ 15 января 2012

Я использую 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>

Просто для справки, я обычно программирую на C # или Java и запускаю свой сайт в Google Chrome.

Ответы [ 3 ]

77 голосов
/ 15 января 2012

Так что здесь может быть что-то не так.

Сначала начните с чтения, как использовать XMLHttpRequest.open(), поскольку существует третий необязательный параметр для указания того, следует ли делать асинхронный запрос, по умолчанию true .Это означает, что вы делаете асинхронный запрос и вам необходимо указать функцию обратного вызова, прежде чем вы выполните send().Вот пример из MDN :

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 для документации / примеров Javascript API/ учебники.

2 голосов
/ 15 января 2012

Проблема скорее всего заключается в строке:

window.onload = onPageLoad();

При включении в скобки вы говорите, что onload должно равняться возвращаемому значению onPageLoad(). Например:

/*Example function*/
function onPageLoad()
{
    return "science";
}
/*Set on load*/
window.onload = onPageLoad()

Если вы распечатаете значение window.onload на консоли, оно будет:

наука

Решение - убрать скобки:

window.onload = onPageLoad;

Итак, вы используете onPageLoad в качестве ссылки на так называемую функцию.

Наконец, для получения значения ответа вам понадобится слушатель readystatechange для вашего XMLHttpRequest объекта, поскольку он асинхронный:

xmlDoc = xmlhttp.responseXML;
parser = new DOMParser(); // This code is untested as it doesn't run this far.

Здесь вы добавляете слушателя:

xmlHttp.onreadystatechange = function() {
    if(this.readyState == 4) {
        // Do something
    }
}
2 голосов
/ 15 января 2012

Я вижу 2 возможных проблемы:

Проблема 1

  • объект XMLHTTPRequest не завершил загрузку данных в то время, когда вы пытаетесь его использовать

Решение: назначить функцию обратного вызова объекту «onreadystatechange» -event и обработать данные в этой функции

xmlhttp.onreadystatechange = callbackFunctionName;

Как только состояние достигнет DONE (4),содержимое ответа готово к прочтению.

Проблема 2

  • объект XMLHTTPRequest существует не во всех браузерах (с таким именем)

Решение:Или используйте try-catch для создания правильного объекта для правильного браузера (ActiveXObject в IE) или используйте инфраструктуру, например jQuery ajax-метод

Примечание: если вы решите использовать jQueryajax-метод, вы назначаете функцию обратного вызова с помощью jqXHR.done ()

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