Pobierz obraz za pomocą JavaScript
W tej chwili mam {[2] } i chcę zapisać go jako PNG. Mogę to zrobić z tymi wszystkimi fantazyjnymi skomplikowanymi API systemu plików, ale tak naprawdę ich nie lubię.
Wiem czy jest na nim link z download
atrybutem:
<a href="img.png" download="output.png">Download</a>
Pobierze plik, jeśli użytkownik go kliknie. Dlatego wymyśliłem to:
$("<a>")
.attr("href", "img.png")
.attr("download", "output.png")
.appendTo("body")
.click()
.remove();
Demo: http://jsfiddle.net/DerekL/Wx7wn/
Jednak, to nie wydaje się działać. Czy musi być wyzwalany przez akcję użytkownika? Albo dlaczego nie zadziałało?
2 answers
Problem polega na tym, że jQuery nie uruchamia natywnego zdarzenia click
dla elementów <a>
, aby nawigacja nie miała miejsca( normalne zachowanie <a>
), więc musisz to zrobić ręcznie. W prawie wszystkich innych scenariuszach uruchamiane jest natywne Zdarzenie DOM(przynajmniej próba-to w try/catch).
Aby uruchomić go ręcznie, spróbuj:
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/
Odpowiedni wiersz w bieżącym źródle 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 ) ) {
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-19 15:09:44
Jak wyjaśnił @ Ian , problem polega na tym, że click()
jQuery nie jest tym samym, co natywny.
Dlatego rozważ użycie vanilla-js zamiast jQuery:
var a = document.createElement('a');
a.href = "img.png";
a.download = "output.png";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:16