2023年12月21日发(作者:)

// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling.// v4 adds AMD/UMD, commonJS, and plain browser support// v4.1 adds url download capability via solo URL argument (same domain/CORS only)// v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors// /rndme/download

(function (root, factory) { if (typeof define === 'function' && ) { // AMD. Register as an anonymous module. define([], factory); } else if (typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support s, // like Node. s = factory(); } else { // Browser globals (root is window) ad = factory(); }}(this, function () {

return function download(data, strFileName, strMimeType) {

var self = window, // this script is only for defaultMime = "application/octet-stream", // this default mime also triggers iframe downloads mimeType = strMimeType || defaultMime, payload = data, url = !strFileName && !strMimeType && payload, anchor = Element("a"), toString = function(a){return String(a);}, myBlob = ( || b || Blob || toString), fileName = strFileName || "download", blob, reader; myBlob= ? (self) : Blob ;

if(String(this)==="true"){ //reverse arguments, allowing (true, "text/xml", "") to act as a callback payload=[payload, mimeType]; mimeType=payload[0]; payload=payload[1]; }

if(url && < 2048){ // if no filename and no mime, assume a url was passed as the only argument fileName = ("/").pop().split("?")[0]; = url; // assign href prop to temp anchor if(f(url) !== -1){ // if the browser determines that it's a potentially valid url path: var ajax=new XMLHttpRequest(); ( "GET", url, true); seType = 'blob'; = function(e){

download(se, fileName, defaultMime); }; setTimeout(function(){ ();}, 0); // allows setting custom ajax headers using the return: return ajax; } // end if valid url? } // end if url?

//go ahead and download dataURLs right away if(/^data:[w+-]+[w+-]+[,;]/.test(payload)){

if( > (1024*1024*1.999) && myBlob !== toString ){ payload=dataUrlToBlob(payload); mimeType= || defaultMime; }else{

return Blob ? // IE10 can't do a[download], only Blobs: Blob(dataUrlToBlob(payload), fileName) : saver(payload) ; // everyone else can save dataURLs un-processed }

}//end if dataURL passed?

blob = payload instanceof myBlob ? payload : new myBlob([payload], {type: mimeType}) ;

function dataUrlToBlob(strUrl) { var parts= (/[:;,]/), type= parts[1], decoder= parts[2] == "base64" ? atob : decodeURIComponent, binData= decoder( () ), mx= , i= 0, uiArr= new Uint8Array(mx);