如何在IE9中读取二进制数据?

20

我正在处理一些JavaScript代码,它使用Photoshop嵌入的路径来创建图像的Alpha遮罩。IMG标签的onload处理程序将调用clip(this)函数。该函数加载图像源文件并扫描它。以下是设置:

function clip(img) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', img.src, true);
    xhr.responseType = 'arraybuffer';
    xhr.target = img;

    xhr.onload = function(e) {
        var bytes = new Uint8Array(this.response);
        var p = findPhotoshopSegment(bytes);
        if(p) {
            var paths = parse8BIMData(bytes, p);

            /* ... replaces IMG with SVG tag ... */
        }
    };
    xhr.send();
}

你可以在http://flaczki.net46.net/JPEG/SVG.html中实际查看代码。

目前只在Firefox、Chrome和Safari中有效,在IE9中无效。浏览器支持SVG但不支持Uint8Array。是否有某种解决方法?


在页面https://developers.google.com/chrome/chrome-frame/上使用Google Chrome Frame。 - Mikko Ohtamaa
“在IE9中无法运行”不是错误信息 - 如果你想玩得更深入,那么你真的需要自己做一些工作。 - symcbean
2个回答

27

在使用pdf.js库时,我遇到了同样的问题,我找到的解决方法是制作自己的Uint8Array,下面是你需要的代码。所有的功劳归notmasteryet@github所有,完整的代码可以在这里找到https://gist.github.com/1057924

(function() {
  try {
    var a = new Uint8Array(1);
    return; //no need
  } catch(e) { }

  function subarray(start, end) {
    return this.slice(start, end);
  }

  function set_(array, offset) {
    if (arguments.length < 2) offset = 0;
    for (var i = 0, n = array.length; i < n; ++i, ++offset)
      this[offset] = array[i] & 0xFF;
  }

  // we need typed arrays
  function TypedArray(arg1) {
    var result;
    if (typeof arg1 === "number") {
       result = new Array(arg1);
       for (var i = 0; i < arg1; ++i)
         result[i] = 0;
    } else
       result = arg1.slice(0);
    result.subarray = subarray;
    result.buffer = result;
    result.byteLength = result.length;
    result.set = set_;
    if (typeof arg1 === "object" && arg1.buffer)
      result.buffer = arg1.buffer;

    return result;
  }

  window.Uint8Array = TypedArray;
  window.Uint32Array = TypedArray;
  window.Int32Array = TypedArray;
})();

太好了!现在我的代码在IE中也可以运行了。那是一个不错的即插即用的解决方案。谢谢。 - cleong
@Milan Jaric,我尝试使用您的代码,但无法使其正常工作。您能否向我展示如何使用它来替换我的Uint8Array,在Safari上无法工作..谢谢...这是我的代码。var frequencyData = new Uint8Array(analyser.frequencyBinCount); 这是我的问题:http://stackoverflow.com/questions/31629868/web-audio-analyser-not-working-in-safari - Sarah
请问您能否提供Safari控制台日志中的错误信息?由于我没有IOS设备来测试您的代码,所以很难确定问题的原因。 - Milan Jaric

6
如果您想确保更广泛的兼容性,您也可以使用 PDF.js 分发中“web”目录下包含的 compatibility.js 文件。从 Mozilla Github 获取 PDF.js,解压缩 zip 归档文件并从上述目录中包括 compatibility.js 文件。它还使得 PDF.js 库可以在例如 IE9 中工作。

你有没有关于如何在Windows Phone上使用PDF.js的想法?我遇到了可怕的问题,无法访问XHR,出现“拒绝访问”的错误。我仍在研究和尝试不同的路径,但希望你能为我提供一些关于如何在wp8.1上使用它的见解。 - Thierry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接