Ajax не пройдет мимо readyState 1, почему?

Я пытаюсь заставить эту функцию работать, которая делает запрос на параметр url затем отправляет текст ответа callback которая является функцией.

Кажется, что это только до readyState 1 (благодаря командам Firebug).

Вот:

function Request(url, callback){
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} else{
    return false;
}
httpRequest.onreadystatechange = function(){
    console.log(httpRequest.readyState);
    if (httpRequest.readyState == 4) {
        callback(httpRequest.responseText);
    }
};
console.log(httpRequest, url);
httpRequest.open('GET', url, true);
httpRequest.send(null);
}

5 ответов

Решение

Я решил эту проблему, назначив событие onload вместо onreadystatechange:

function Request(url, callback){
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} else{
        return false;
}

var readyStateChange = function(){
    console.log(httpRequest.readyState);

    if (httpRequest.readyState == 4) {
                callback(httpRequest.responseText);
    }
};


if (isFirefox && firefoxVersion > 3) {
    httpRequest.onload = readyStateChange;
} else {
    httpRequest.onreadystatechange = readyStateChange;
}

console.log(httpRequest, url);
httpRequest.open('GET', url, true);
httpRequest.send(null);
}

Убедитесь, что рассматриваемый URL действительно отвечает, посетив его непосредственно в браузере.

Тест с другим браузером вы получите тот же результат.

Используйте некоторую форму HTTP-монитора для наблюдения за разговором клиента с сервером (мой любимый - Fiddler)

Возможно, запрос Ajax не возвращает данные (так что какая-то ошибка на стороне сервера). Попробуйте включить опцию "show XMLHttpRequests" в консоли firebug, чтобы проверить это.

У меня была такая же проблема на FireFox, но не на Chrome.

Проблема заключалась в том, что в моем ответе был установлен тип mime "application/octet-stream".

Изменение его на "text/html" сделало так, чтобы оно работало и в FireFox.

Я также столкнулся с той же проблемой. Читая URL-адрес ниже, я понял мой.

http://bytes.com/topic/javascript/answers/548442-ajax-readystate-1-wall

в основном, когда я назначаю свою функцию в качестве прослушивателя событий для httpRequest.onreadystatechange, я не могу передать ей какую-либо переменную. ТАК, что мне нужно встроить переменную внутри строки HTTP POST в серверную часть, а затем получить ее обратно из ответа HTTP.

Он отлично работает для FF 3. Нет необходимости использовать jQuery.

Другие вопросы по тегам