【问题标题】:How to read binary data in IE9?如何在 IE9 中读取二进制数据?
【发布时间】:2012-08-06 13:31:55
【问题描述】:

我正在编写一些 Javascript 代码,该代码使用 Photoshop 嵌入的路径创建图像的 alpha 蒙版。 IMG 标记的 onload 处理程序将调用剪辑(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。有什么解决办法吗?

【问题讨论】:

  • 在页面上使用谷歌浏览器框架developers.google.com/chrome/chrome-frame
  • "It doesn't work in IE9" 不是错误信息——如果你想玩一把锋利的刀,那么你真的需要自己做一些工作。

标签: javascript ajax internet-explorer-9


【解决方案1】:

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

【讨论】:

  • 您对如何在 Windows Phone 上使用 PDF.js 有任何想法吗?我在访问 XHR 时遇到了可怕的问题,我得到“访问被拒绝”。我仍在研究它并尝试不同的路径,但希望您能够为我提供一些关于如何将它与 wp8.1 一起使用的见解
【解决方案2】:

我在玩 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 中运行。这是一个很好的交钥匙解决方案。谢谢。
  • @Milan Jaric 我尝试使用您的代码,但无法正常工作。你能告诉我如何使用它来替换我的 Uint8Array,它不能在 safari 上运行。谢谢...这是我的代码。 var frequencyData = new Uint8Array(analyzer.frequencyBinCount);这是我的问题:stackoverflow.com/questions/31629868/…
  • 能否提供来自 Safari 控制台日志的错误信息?很难说是什么问题,因为我没有 IOS 来测试你的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2017-07-10
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2016-03-08
相关资源
最近更新 更多