【问题标题】:Canvas toBlob is not recognized as a function in safariCanvas toBlob 在 Safari 中未被识别为函数
【发布时间】:2019-11-28 23:22:45
【问题描述】:

我可以使用下面的代码在 Chrome 和 Firefox 中下载图像,但在 Safari 中会抛出此错误:

TypeError: 'undefined' is not a function(评估 'canvas.toBlob(blobCallback('wallpaperdeae'))')

$("#save").click(function(){

   function blobCallback(iconName) {
        return function (b) {

            var a = document.getElementById('download');
            a.download = iconName + ".jpg";
            a.href = window.URL.createObjectURL(b);
        }
    }
    canvas.toBlob(blobCallback('wallpaperdeae'));

});

【问题讨论】:

    标签: javascript canvas safari html5-canvas


    【解决方案1】:

    我认为 Safari 不支持 toBlob 方法:

    https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob#Browser_compatibility

    据此,它仅在 Chrome 50+ 和 Firefox 中可用(19+ 用于基本支持,25+ 用于图像质量参数),并在 IE 10 及更高版本中提供一些基本支持。

    所以对 Safari 没有任何支持。

    编辑:根据引用的 URL,2017 年 9 月 19 日发布的 Safari 11 中的 toBlob 方法添加了支持

    【讨论】:

    • 感谢 Dibsy Jr,您能否建议任何其他替代方法来解决此问题。
    • 取决于您需要支持的浏览器版本,但您始终可以使用:github.com/blueimp/JavaScript-Canvas-to-Blob 充当浏览器中 toBlob 方法的 polyfill
    • 另外,请选择这个作为选择的答案,如果它对你有帮助,请投票。
    • 现在看来,Safari 中实际上有一些支持(根据引用的 URL)。
    • 感谢@thesquaregroot 我已经添加了一个编辑说明何时添加。
    【解决方案2】:

    有一个"low performance polyfill based on toDataURL" posted on MDN

    if (!HTMLCanvasElement.prototype.toBlob) {
      Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
        value: function (callback, type, quality) {
          var canvas = this;
          setTimeout(function() {
    
            var binStr = atob( canvas.toDataURL(type, quality).split(',')[1] ),
                len = binStr.length,
                arr = new Uint8Array(len);
    
            for (var i = 0; i < len; i++ ) {
              arr[i] = binStr.charCodeAt(i);
            }
    
            callback( new Blob( [arr], {type: type || 'image/png'} ) );
    
          });
        }
      });
    }
    

    【讨论】:

    • 这在 Edge 中不起作用。它将错误从“不是函数”更改为“预期的函数”。但还是不行。我还没有找到在边缘工作的 toBlob polyfill。
    • 有趣的是,这在 Edge 中适用于我最近进行的一项测试,因此自 4 月以来可能发生了一些变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多