Kita dapat menggunakan api URL , khususnya URL.createObjectURL () , dan Blob api untuk menyandikan dan mengunduh apa saja.
Jika unduhan Anda kecil, ini berfungsi dengan baik:
document.body.innerHTML +=
`<a id="download" download="PATTERN.json" href="${URL.createObjectURL(new Blob([JSON.stringify("HELLO WORLD", null, 2)]))}"> Click me</a>`
download.click()
download.outerHTML = ""
Jika unduhan Anda besar, alih-alih menggunakan DOM, cara yang lebih baik adalah membuat elemen tautan dengan parameter unduhan, dan memicu klik.
Perhatikan bahwa elemen tautan tidak ditambahkan ke dokumen tetapi klik itu berfungsi! Ini dimungkinkan untuk membuat unduhan ratusan Mo dengan cara ini.
const stack = {
some: "stuffs",
alot: "of them!"
}
BUTTONDOWNLOAD.onclick = (function(){
let j = document.createElement("a")
j.id = "download"
j.download = "stack_"+Date.now()+".json"
j.href = URL.createObjectURL(new Blob([JSON.stringify(stack, null, 2)]))
j.click()
})
<button id="BUTTONDOWNLOAD">DOWNLOAD!</button>
Bonus! Unduh objek siklik apa pun , hindari kesalahan:
TypeError: nilai objek siklik (Firefox) TypeError: Konversi
struktur melingkar ke JSON (Chrome dan Opera) TypeError: Circular
referensi dalam argumen nilai tidak didukung (Tepi)
Menggunakan https://github.com/douglascrockford/JSON-js/blob/master/cycle.js
Pada contoh ini, mengunduh document
objek sebagai json.
/* JSON.decycle */
if(typeof JSON.decycle!=="function"){JSON.decycle=function decycle(object,replacer){"use strict";var objects=new WeakMap();return(function derez(value,path){var old_path;var nu;if(replacer!==undefined){value=replacer(value)}
if(typeof value==="object"&&value!==null&&!(value instanceof Boolean)&&!(value instanceof Date)&&!(value instanceof Number)&&!(value instanceof RegExp)&&!(value instanceof String)){old_path=objects.get(value);if(old_path!==undefined){return{$ref:old_path}}
objects.set(value,path);if(Array.isArray(value)){nu=[];value.forEach(function(element,i){nu[i]=derez(element,path+"["+i+"]")})}else{nu={};Object.keys(value).forEach(function(name){nu[name]=derez(value[name],path+"["+JSON.stringify(name)+"]")})}
return nu}
return value}(object,"$"))}}
document.body.innerHTML +=
`<a id="download" download="PATTERN.json" href="${URL.createObjectURL(new Blob([JSON.stringify(JSON.decycle(document), null, 2)]))}"></a>`
download.click()