【发布时间】:2012-06-23 01:37:23
【问题描述】:
我正在 Google Chrome、Safari 和 Firefox 中使用 XMLHttpRequest 加载 JSON 文件。在所有三个浏览器中,我都收到了ProgressEvents,它正确显示了.loaded 属性。但是,.lengthComputable 属性为 false,.total 属性为零。我检查了Content-Length HTTP 标头是否正在发送并且是正确的 - 是的。响应是 gzip 编码的,但 Content-length 正确显示了编码长度(解压缩前)。
为什么我的ProgressEvents 中没有总长度?
这是标题:
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
注意:该文件是通过 Google App Engine 提供的。
这里是 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 显示数百个事件,其中.loadeds 是最新的,但.lengthComputable 始终为假,.total 始终为零。 self 指的是负责这个XMLHttpRequest 的对象。
【问题讨论】:
-
我们能看到你的 javascript 代码正在查看这些数据吗?
-
你试过在非谷歌应用引擎服务器上使用它吗?如果
lengthComputable为假,则 xhr 对象不知道文件有多长。我们在这里使用 GAE,但它的大部分功能都存在大量问题——这不足为奇。 -
我尝试了另一台服务器,但它给了我分块编码,因此没有 Content-Length。在这种情况下,lengthComputable == false 是有意义的。稍后我将不得不尝试另一个。在我看来,GAE 行为的标题 - 但我和你一样怀疑。