【发布时间】:2015-05-05 09:18:59
【问题描述】:
我正在尝试在 JavaScript 中流式传输大量二进制数据,在下载完成之前访问数据。在大多数主流浏览器中,我可以使用charset=x-user-defined 技巧在 progress 事件期间手动获取原始字节数据。
然而,在 Internet Explorer 中,这个技巧不起作用,我只能使用 VBArray(responseBody).toArray() 方法,这非常慢。但是,由于我只需要支持 IE 11 及更高版本,我应该可以利用 IE 的MSStream 逐步获取数据。以下代码在 IE 11 桌面上运行良好,但在运行 IE 11 移动版的 Lumia Windows Phone 8.1 设备上运行良好:
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'ms-stream';
xhr.onreadystatechange = function () {
if (xhr.readyState === 3 && xhr.status === 200) {
// reader is an MSStreamReader object
reader.readAsArrayBuffer(xhr.response);
}
};
xhr.send();
在 Windows Phone 设备上,readyState 永远不会超过 1,status 为 0,表示发生了未知错误,即使没有引发实际错误。
有谁知道为什么这对我不起作用,或者可能是问题的解决方案?
【问题讨论】:
-
嗯,从我找到的材料here,应该可以。生成 URL 的代码是否正确?此外,
readAsArrayBuffer方法是否通过msDetachStream()将IInputStreamObject拉出MSStream?这就是它所要做的,但我不确定这是否会完全终止流的其余部分,而只会给你当前下载的任何内容。MSStream还有其他方法可以结账吗? -
哦,你使用的是
MSStreamReaderas described here。呃...这似乎消除了我之前所说的。同样,您的 URL 在 Windows Phone 和桌面之间形成的不同吗? -
@shotgun 页面和数据在台式机和手机上完全相同,我已经在两者上尝试了一个小的单独测试并得到了相同的结果。
-
您通过
url请求什么样的资源?该资源是否内置了浏览器检测功能?如果是这样,就我从一些粗略的 Google 搜索中看到的而言,Windows 8+ 和 IE10/11 Mobile 似乎不能很好地处理浏览器检测脚本。
标签: javascript internet-explorer windows-phone-8.1