6

我正在使用FileSaver.js文件将我的画布保存到图像中。下载后我必须关闭窗口。有什么办法可以做到这一点?

这是我尝试过的代码,

canvas.toBlob(function (blob) {
    saveAs(blob, "RQGantt.png");
    window.close();
});

它适用于小尺寸图像。但是当我有大尺寸的图像时,我的窗口在开始下载之前就关闭了。

有没有办法在客户端做到这一点?

4

3 回答 3

4

这是他们为https://github.com/eligrey/FileSaver.js/issues/52问题提供的响应。

不幸的是,JS 无法判断文件何时完成保存,因此用户必须关闭它可能为保存内容而创建的新选项卡。

所以,我做了以下解决方法

window.onbeforeunload = function () {
    //For IE
    if (HTMLCanvasElement.prototype.msToBlob && window["ganttBlob"])
        saveAs(ganttBlob, "imageName.png");
}

canvas.toBlob(function (blob) {
    window.ganttBlob = blob;
    // For Non IE Browser
    if (!canvas.msToBlob) {
        saveAs(blob, "imageName.png");
        setTimeout(function () {
            window.close();
        }, 500);
    }
    else //For IE
        window.close();
});

所以,现在即使窗口已经关闭,下载提示选项也会出现。

于 2013-10-25T07:36:43.623 回答
2

您提供的链接中的页面说:

FileSaver.js在本身不支持它的浏览器中实现 HTML5 W3C saveAs() FileSaver接口。

指向文件保护程序规范的链接页面表示它支持以下重要事件:

函数类型的 onwriteend

writeend 事件的处理程序。

这就是你需要使用的。保存操作,就像 javascript 中最重要的事情一样,是一个异步事件。

你想捕捉写操作的结束,然后关闭窗口:

canvas.toBlob(function (blob) {
    var filesaver = saveAs(blob, "RQGantt.png");
    filesaver.onwriteend = function() { window.close(); }
}

编辑

不幸的是,这似乎不可用。见:https ://github.com/eligrey/FileSaver.js/issues/1

也许您可以要求插件的作者重新审视这个问题。

我能建议的最好的方法是添加一个让用户单击关闭的按钮。单击时,您可以调用 abort,如 github 页面所示,并假设如果它已经完成,它将干净地退出。然后做一个window.close。

于 2013-10-22T15:27:10.703 回答
1

您可能想尝试以下版本的 FileSaver.js:https ://github.com/graingert/FileSaver.js/commit/db6a69e6f072901c2f00a4461136e38c58e082b1

结合这个语法:

blob = new Blob([icsFileContents], {type: "application/octet-stream;charset=utf-8"});

var fileSaver = saveAs(blob, "calEvent.ics").onwriteend = function() {
    setTimeout(function() { window.close(); }, 250);
};

我没有对大文件进行过测试,尽管我在慢速 3G 连接上进行了测试,它在关闭之前等待文件被写入和下载。

来源:https ://github.com/eligrey/FileSaver.js/issues/1

于 2018-11-21T16:17:27.733 回答