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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11881472/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-26 14:39:01  来源:igfitidea点击:

How to read binary data in IE9?

javascriptajaxinternet-explorer-9

提问by cleong

I'm working on some Javascript code that creates an alpha mask of a image using paths embedded by Photoshop. The onload handler of a IMG tag would call a clip(this). The function load the image's source file and scans through it. Here's the setup:

我正在处理一些使用 Photoshop 嵌入的路径创建图像的 alpha 蒙版的 Javascript 代码。IMG 标记的加载处理程序将调用剪辑(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();
}

You can see the code in action at http://flaczki.net46.net/JPEG/SVG.html

您可以在http://flaczki.net46.net/JPEG/SVG.html 上看到正在运行的代码

Currently, it only works in Firefox, Chrome, and Safari. It doesn't work in IE9. The browser supports SVG but not Uint8Array. Is there some kind of workaround?

目前,它仅适用于 Firefox、Chrome 和 Safari。它在 IE9 中不起作用。浏览器支持 SVG 但不支持 Uint8Array。有什么解决方法吗?

回答by Milan Jaric

I had same issue while playing with pdf.js library, and solution I found is to make my own Uint8Array, below is code which you need. All credits goes to notmasteryet@github and full code can be found here https://gist.github.com/1057924

我在玩 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;
})();

回答by AlexB

If you want to be assured you get wider range of compatibility, you can also use the compatibility.js file included in the PDF.js distribution under the "web" directory. Get PDF.js from Mozilla Github, decompress the zip archive and include the compatibility.js file from the above directory. It also makes PDF.js library work in e.g. IE9

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