18

Google Chrome、Safari、FirefoxでXMLHttpRequestを使用してJSONファイルを読み込んでいます。3つのブラウザすべてで、プロパティProgressEventを正しく表示するsを受信して​​い.loadedます。ただし、.lengthComputableプロパティはfalseであり、.totalプロパティはゼロです。Content-LengthHTTPヘッダーが送信されており、正しいことを確認しました。正しいです。応答はgzipでエンコードされていContent-lengthますが、エンコードされた長さ(解凍前)が正しく表示されます。

なぜ全長が私ProgressEventので利用できないのですか?

ヘッダーは次のとおりです。

HTTP/1.1 200 OK
ETag: "hKXdZA"
Date: Wed, 20 Jun 2012 20:17:17 GMT
Expires: Wed, 20 Jun 2012 20:17:17 GMT
Cache-Control: private, max-age=3600
X-AppEngine-Estimated-CPM-US-Dollars: $0.000108
X-AppEngine-Resource-Usage: ms=2 cpu_ms=0 api_cpu_ms=0
Content-Type: application/json
Content-Encoding: gzip
Server: Google Frontend
Content-Length: 621606

注:ファイルはGoogleAppEngineを介して提供されています。

JavaScriptは次のとおりです。

var req;
if (window.XMLHttpRequest){
    req = new XMLHttpRequest();
    if(req.overrideMimeType){
        req.overrideMimeType( "text/json" );
    }
}else{
    req = new ActiveXObject('Microsoft.XMLHTTP');
}

// Listen for progress events
req.addEventListener("progress", function (event) {
    console.log(event, event.lengthComputable, event.total);
    if (event.lengthComputable) {
        self.progress = event.loaded / event.total;
    } else if (this.explicitTotal) {
        self.progress = Math.min(1, event.loaded / self.explicitTotal);
    } else {
        self.progress = 0;
    }
    self.dispatchEvent(Breel.Asset.ON_PROGRESS);
}, false);

req.open('GET', this.url);

注:console.logそのコードでは、最新.loadedのsを持つ何百ものイベントが表示されていますが、.lengthComputable常にfalseであり、.total常にゼロです。selfこれを担当するオブジェクトを指しますXMLHttpRequest

4

5 に答える 5

19

XMLHttpRequestProgressEvent 内で lengthComputable が false の場合、サーバーが応答で Content-Length ヘッダーを送信しなかったことを意味します。

nginx をプロキシ サーバーとして使用している場合、これが原因である可能性があります。特に、アップストリーム サーバーからプロキシ サーバーを介してブラウザに Content-Length ヘッダーを渡していない場合はそうです。

于 2012-08-07T15:12:12.687 に答える