Podemos utilizar la dirección URL de la API, en particular, URL.createObjectURL () , y el Blob API para codificar y descarga casi cualquier cosa.
Si su descarga es pequeña, esto funciona bien:
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 = ""
Si su descarga es enorme, en lugar de usar el DOM, una mejor manera es crear un elemento de enlace con los parámetros de descarga y activar un clic.
¡Observe que el elemento de enlace no se agrega al documento, pero el clic funciona de todos modos! Esto es posible para crear una descarga de muchos cientos de Mo de esta manera.
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>
¡Prima! Descargue cualquier objeto cíclico , evite los errores:
TypeError: valor de objeto cíclico (Firefox) TypeError: Convertir
estructura circular a JSON (Chrome y Opera) TypeError: Circular
referencia en argumento de valor no compatible (Edge)
Usando https://github.com/douglascrockford/JSON-js/blob/master/cycle.js
En este ejemplo, descargando el document
objeto como 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()