Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Download attribute not working in Firefox

Tags:

I'm trying to let the user download some data as a CSV (text) file, using Javascript and the HTML5 Download attribute (http://caniuse.com/#feat=download).

The data is formed in an array, and then added to a new Blob object.

It works perfectly in Chrome and Opera, but does not work at all in Firefox.

Original example I am attempting to copy: http://blog.eliacontini.info/post/79860720828/export-to-csv-using-javascript-the-download-attribute

Fiddle: http://jsfiddle.net/8wos7cf8/5/

Javascript:

$('#downloadButton').click(function () { // some data to export var data = [{     "title": "Book title 1",     "author": "Name1 Surname1" }, {     "title": "Book title 2",     "author": "Name2 Surname2" }, {     "title": "Book title 3",     "author": "Name3 Surname3" }, {     "title": "Book title 4",     "author": "Name4 Surname4" }];  // prepare CSV data var csvData = new Array(); csvData.push('"Book title","Author"'); data.forEach(function (item, index, array) {     csvData.push('"' + item.title + '","' + item.author + '"'); });  // download stuff var fileName = "data.csv"; var buffer = csvData.join("\n"); var blob = new Blob([buffer], {     "type": "text/csv;charset=utf8;" }); var link = document.createElement("a");  if (link.download !== undefined) { // feature detection     // Browsers that support HTML5 download attribute     link.setAttribute("href", window.URL.createObjectURL(blob));     link.setAttribute("download", fileName);     link.click(); } else {     alert('CSV export only works in Chrome, Firefox, and Opera.'); } }); 

HTML:

<div class="toggle-button" id="downloadButton"><span>Export to CSV</span></div> 

When I add an alert with:

alert(window.URL.createObjectURL(blob)); 

I get this result in Firefox:

Firefox blob

...and this result in Chrome/Opera:

Chrome blob

So it seems like it omits the URL path in Firefox for some reason.

like image 459
MattSidor Avatar asked Nov 24 '14 22:11

MattSidor


1 Answers

You might try adding the element to the DOM before triggering the click:

document.body.appendChild(link); link.click(); document.body.removeChild(link); 

This worked for me in Firefox 34

jsfiddle: http://jsfiddle.net/8wos7cf8/7/

like image 187
jmfolds Avatar answered Sep 20 '22 13:09

jmfolds