我有一个奇怪的问题,下面的函数是我创建的基于我在网上发现的关于在客户端动态创建一个Blob的一个二进制数据(作为数组传递)并能够下载它.这在Chrome中非常出色,但在Firefox中没有做任何事情 - 除非我调试并逐步完成代码.是的,奇怪的是,如果我在函数内创建一个断点并逐步执行它,a.click()将调出下载窗口!
function downloadFile(filename, data) {
var a = document.createElement('a');
a.style = "display: none";
var blob = new Blob(data, {type: "application/octet-stream"});
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}
Run Code Online (Sandbox Code Playgroud)
谁能帮我?这是使用Firefox 38.0.5测试的.
我使用以下代码在 JavaScript 中保存文件:
var a = document.createElement('a');
a.href = URL.createObjectURL(new Blob(['SOME DATA']));
a.download = 'some.dat';
a.click();
Run Code Online (Sandbox Code Playgroud)
我想在下载文件后撤销 URL(使用 URL.revokeObjectURL)。什么时候这样做是安全的?
我可以在调用后立即撤销它吗a.click()(这似乎有效,但我不确定它是否安全)?ina的点击事件监听器?有没有办法让点击事件监听器在默认操作之后运行?
更新
由于提出了下面的问题并在发现代码中的错误后得出了一个更基本的问题,我发现了更多信息,例如在 MDN Web 文档中的下载 API 方法 downloads.download() 中,它指出对象的撤销url 仅应在文件/url 下载后执行。因此,我花了一些时间试图了解 Web 扩展是否使下载 API onChanged 事件对网页的 javascript“可用”,但我认为不会。我不明白为什么下载 API 仅适用于扩展程序,特别是当存在很多与内存使用/对象 url 撤销问题有关的问题时。例如,等待用户完成 JavaScript 中的 blob 下载。
如果你知道的话请解释一下吗?谢谢。
从关闭的 Firefox 浏览器开始,右键单击要在 Firefox 中打开的本地 html 文件,它将打开并显示五个 firefox.exe 进程,如 Windows 任务管理器中所示。其中四个进程的启动内存介于 20,000k 到 25,000k 之间,一个进程的内存约为 115,000k。
此 html 页面有一个 indexedDB 数据库,其中有 50 个对象存储,每个存储包含 50 个对象。每个对象都从其对象存储中提取并使用 JSON.stringify 转换为字符串,然后写入二维数组。然后,数组的所有元素被连接成一个大字符串,转换为一个 blob,并通过 URL 对象写入硬盘,该对象随后立即被撤销。最终文件大约190MB。
如果代码在转换为 blob 之前停止,则 firefox.exe 进程之一的内存使用量会增加到大约 425,000k,然后在数组元素连接成一个数组后大约 5-10 秒内回落到 25,000k。单字符串。
如果代码运行完成,同一 firefox.exe 进程的内存使用量将增长到大约 1,000,000k,然后下降到大约 225,000k。以 115,000k 启动的 firefox.exe 进程也在代码的 blob 阶段增加到约 …