IE Mobile / Windows Phone 8.1上的XHR responseType“ms-stream”失败

时间:2015-05-05 09:18:59

标签: javascript internet-explorer windows-phone-8.1

我正在尝试在JavaScript中传输大量二进制数据,在下载完成之前访问数据。在大多数主流浏览器中,我可以使用charset=x-user-defined技巧在 progress 事件期间手动获取原始字节数据。

然而,在Internet Explorer中,这个技巧不起作用,而是让我使用VBArray(responseBody).toArray()方法,这是非常缓慢的。但是,由于我只需要支持IE 11及更高版本,我应该能够利用IE的MSStream来逐步获取数据。以下代码适用于IE 11桌面,但不适用于运行IE 11 mobile的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,表示即使没有引发实际错误也会发生未知错误。

有谁知道为什么这对我不起作用,或者可能解决问题?

1 个答案:

答案 0 :(得分:2)

假设您尝试过相同的原始政策解决方案,并且相当确定该问题与相同的原始政策无关......

我认为问题是IE没有进入readystate 3,因为在收到整个响应之前它没有得到。

  

此问题的解决方法是向下发送一个2千字节的“前奏曲”   在响应流的顶部 - 我的测试只发送2kb的空间。   收到初始块后,onprogress事件将被触发为   从网络接收每个后续块。

另外,你试过这个......

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onreadystatechange = function () {
    if (xhr.status === 200) {
        var blob = this.response;
        reader.readAsArrayBuffer(blob);
    }
};
xhr.send();