使用JavaScript下载图像

Der*_*會功夫 47 javascript jquery download

现在我有一个canvas,我想将其保存为PNG.我可以用所有那些花哨的复杂文件系统API来做,但我真的不喜欢它们.

我知道是否有链接download属性:

<a href="img.png" download="output.png">Download</a>
Run Code Online (Sandbox Code Playgroud)

如果用户点击它,它将下载该文件.所以我想出了这个:

$("<a>")
    .attr("href", "img.png")
    .attr("download", "output.png")
    .appendTo("body")
    .click()
    .remove();
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/DerekL/Wx7wn/

但是,它似乎不起作用.是否必须由用户操作触发?或者为什么不起作用?

Ian*_*Ian 72

问题是jQuery不会触发元素的本机click事件,<a>因此导航不会发生(a的正常行为<a>),因此您需要手动执行此操作.对于几乎所有其他场景,触发本机DOM事件(至少尝试 - 它在try/catch中).

要手动触发,请尝试:

var a = $("<a>")
    .attr("href", "http://i.stack.imgur.com/L8rHf.png")
    .attr("download", "img.png")
    .appendTo("body");

a[0].click();

a.remove();
Run Code Online (Sandbox Code Playgroud)

演示: http ://jsfiddle.net/HTggQ/

当前jQuery源代码中的相关行:https://github.com/jquery/jquery/blob/1.11.1/src/event.js#L332

if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
        jQuery.acceptData( elem ) ) {
Run Code Online (Sandbox Code Playgroud)

  • [我认为你不需要在DOM中附加/删除它](http://jsfiddle.net/HTggQ/93/) - 你应该能够调用`$('<a>'). ATTR(...)[0].点击()` (5认同)
  • 不是下载,只是在新窗口中打开 (4认同)
  • @ user963936从Firefox 20看起来,它们只允许`download`属性的同源URL(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download ).如果在脚本运行后检查DOM,看起来Firefox会将标记转换为`<img>`,然后jQuery失去对它的引用(为什么`.remove()`似乎没有做任何事情.将`href`更改为指向jsfiddle站点上的资源似乎可以在Firefox中使用. (3认同)
  • 这个答案在 2022 年不再有效,因为浏览器已经发生了变化,现在浏览器将始终遵循链接并打开它可以读取的文件。浏览器仅在无法读取资源(即:zip 或存档)时才会触发下载。/sf/ask/3630329671/ (3认同)
  • 或者[甚至更好,没有jquery](http://stackoverflow.com/a/16523173/1037948) - http://jsfiddle.net/HTggQ/95/ (2认同)

Ori*_*iol 65

正如@Ian 解释的那样,问题在于jQuery click()与原生jQuery 不同.

因此,考虑使用vanilla-js而不是jQuery:

var a = document.createElement('a');
a.href = "img.png";
a.download = "output.png";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
Run Code Online (Sandbox Code Playgroud)

演示

  • 如果我不将链接插入树中,@Jsilvermist 似乎在 Firefox 上不起作用。 (3认同)