2013-06-26 21 views
36

Ich habe gerade eine canvas und möchte sie als PNG speichern. Ich kann es mit all diesen komplizierten Dateisystem API, aber ich mag sie nicht wirklich.Bild mit JavaScript herunterladen

ich wissen, ob es eine Verbindung mit download Attribut ist:

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

es wird die Datei herunterladen, wenn der Benutzer darauf klickt. Deshalb kam ich mit auf den Punkt:

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

Demo: http://jsfiddle.net/DerekL/Wx7wn/

Es ist jedoch nicht zu funktionieren scheint. Muss es durch eine Benutzeraktion ausgelöst werden? Oder warum hat es nicht funktioniert?

+1

Ich gehe davon aus Sie einen Browser verwenden, die es unterstützt? http://caniuse.com/download – Ian

+1

@Ian Ich verwende Chrome und es unterstützt es. –

+0

ich kann nicht scheinen, es zu verwenden, den Namen, den ich zur Verfügung stelle - können Sie? – drzaus

Antwort

64

Das Problem ist, dass jQuery nicht die native click Ereignis für <a> Elemente auslöst, so dass die Navigation nicht geschieht (das normale Verhalten eines <a>), so müssen Sie dies manuell tun. Für fast alle anderen Szenarien wird das systemeigene DOM-Ereignis ausgelöst (zumindest versucht - es ist in einem try/catch).

Um es manuell auslösen, versuchen:

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/

Relevante Linie in Stromquelle 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)) { 
+0

Könnte dies in eine .each() eingefügt werden? Ich kann nur scheinbar ein Bild nach dem anderen mit dieser Technik herunterladen, wahrscheinlich hat es etwas damit zu tun, die Variable zu überladen ... – bafromca

+5

[Ich glaube nicht, dass Sie es an das DOM anhängen/entfernen müssen] (http: // jsfiddle.net/HTggQ/93/) - Sie sollten einfach in der Lage sein, '$ ('') .attr (...) [0] .click()' – drzaus

+2

oder [noch besser, no jquery] (http://StackOverflow.com/a/16523173/1037948) - http://jsfiddle.net/HTggQ/95/ – drzaus

32

Als @Ian explained, das Problem ist, dass jQuerys click() ist nicht das gleiche wie das native.

daher prüfen, mit Vanille-js anstelle von jQuery:

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

Demo

+19

Warum der Downvote? Liegt es daran, dass [nicht genug jQuery] (http://i.stack.imgur.com/sGhaO.gif) vorhanden ist? – Oriol

+3

I upvote Ihren Kommentar und Ihre Antwort. Downvotes ohne Erklärungen sind nicht hilfreich. –

+2

Danke @Oriol. Ich mag Vanille! –