在我的应用程序中,我使用XMLHttpRequest
API请求大型JSON文件。这按预期工作。
我想在用户等待时显示进度条。一些JSON文件大小在6到10MB以上,因此进度条可以帮助提高整体体验。
这是我正在做的示例:
var progress = document.getElementById('progress');
function getData(url) {
var req = new XMLHttpRequest();
req.onprogress = function(event) {
if (event.lengthComputable) {
progress.value = event.loaded / event.total * 100;
} else {
console.log('lengthComputable failed');
}
}
req.onload = function() {
console.log('Finished loading');
// ... handle data
}
req.open('GET', url, true);
req.overrideMimeType('application/json');
req.send(null);
}
getData('https://raw.githubusercontent.com/datasets/geo-countries/master/data/countries.geojson');
此外,在 jsfiddle 上也有:https://jsfiddle.net/ctL5f73s/1/ 如果内容没有经过 gzip 压缩,进度条在我测试过的所有浏览器上都可以正常工作。但是如果服务器将其发送为 gzip,则仅 Firefox 可以使用。
为了背景,我正在从 GitHub 请求数据。我理解的是,他们将所有资产作为 gzip 提供,并且我无法控制它。
我还知道 XHR 的进度事件应处理压缩内容。其中大部分内容都超出了我的理解范围,但我了解到的是,当内容被压缩时,
lengthComputable
的处理方式不会改变。在
响应标头
中,我看到 Content-Encoding
和 Content-Length
是正确的:
问题是:是否有办法使进度事件在 FireFox 之外的浏览器中与 gzip 内容一起工作?如果不可能,是否有人可以指导我使用替代方案?最好是本机 JS 而不是库。
我不介意兼容性太远,但如果最新版本的 Chrome 无法使用,则会出现问题。
X-Uncompressed-Content-Length: ${file.length}
,并在 JavaScript 端解析它,这样可以确保 100% 的正确性。 - oligofren