web-dev-qa-db-ja.com

AjaxはreadyState1を通過しません、なぜですか?

この関数を機能させようとしています。この関数は、パラメーターurlの要求を実行してから、関数であるcallbackにresponseTextを送信します。

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);
}
11

Onreadystatechangeの代わりにonloadイベントを割り当てるこの問題を回避しました。

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);
}
5

ブラウザで直接アクセスして、問題のURLが実際に応答することを確認します。

別のブラウザでテストしても同じ結果が得られますか。

何らかの形式のHTTPモニターを使用して、クライアントからサーバーへの会話を監視します(私のお気に入りは Fiddler

2
AnthonyWJones

おそらく、Ajaxリクエストはデータを返しません(したがって、ある種のサーバー側エラー)。これを確認するには、Firebugコンソールでオプション「showXMLHttpRequests」を有効にしてみてください。

1
KooiInc

FireFoxでも同じ問題が発生しましたが、Chromeでは発生しませんでした。

問題は、mime-typeが「application/octet-stream」に設定されているという応答でした。

「text/html」に変更すると、FireFoxでも機能するようになりました。

0
Panu Logic

私も同じ問題に直面しました。以下のURLを読んで、私は解決しました。

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

基本的に、関数をhttpRequest.onreadystatechangeのイベントリスナーとして割り当てると、変数を渡すことができません。 SO変数をHTTP内に埋め込む必要があるPOST文字列をサーバーバックエンドに埋め込み、HTTP応答から取得します。

FF3では問題なく動作します。jQueryを使用する必要はありません。

0
user443461