Загрузить изображение с помощью JavaScript

Сейчас у меня есть canvas, и я хочу сохранить его как PNG. Я могу сделать это со всеми этими сложными API файловой системы, но мне они не нравятся.

Я знаю, есть ли ссылка с атрибутом download на нем:

<a href="img.png" download="output.png">Download</a>

он загрузит файл, если пользователь нажмет на него. Поэтому я придумал это:

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

Демо: http://jsfiddle.net/DerekL/Wx7wn/

Однако он не работает. Нужно ли запускать действие пользователя? Или иначе, почему это не сработало?

Ответ 1

Проблема заключается в том, что jQuery не запускает собственное click событие для <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();

DEMO: 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 ) ) {

Ответ 2

Как объясняется @Ian , проблема в том, что jQuery click() не совпадает с исходным.

Поэтому рассмотрим использование 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);

Демо