Javascript 是否有数据uri链接下载的polyfill?

Javascript 是否有数据uri链接下载的polyfill?,javascript,html,polyfills,Javascript,Html,Polyfills,我有一些代码应该由服务器生成: <a download="test.csv" href="data:text/plain;charset=utf-8;base64,w4FydsOtenTFsXLFkXTDvGvDtnJmw7p0w7Nnw6lwLg=="> teszt </a> 它适用于当前的chrome、firefox和opera。我希望它支持MSIE11。AfaikmsSaveBlob就是解决方案。是否有一个现有的js polyfill我可以使用,或者我

我有一些代码应该由服务器生成:

<a download="test.csv" href="data:text/plain;charset=utf-8;base64,w4FydsOtenTFsXLFkXTDvGvDtnJmw7p0w7Nnw6lwLg==">
    teszt
</a>


它适用于当前的chrome、firefox和opera。我希望它支持MSIE11。Afaik
msSaveBlob
就是解决方案。是否有一个现有的js polyfill我可以使用,或者我应该编写它?

好的,我根据在SO答案和中找到的代码制作了一个简单的polyfill。我在MSIE11上测试了它,它工作正常。它不支持使用
XHR
下载文件,只支持数据URI。如果要强制下载文件,我建议使用
内容处置
响应头。在我的例子中,服务器只是创建文件,但不应该存储它,而且我还需要一个HTML响应,所以这就是解决方法。另一种解决方案是用电子邮件发送文件,但我发现用小文件发送更好

(function (){

    addEvent(window, "load", function (){
        if (isInternetExplorer())
            polyfillDataUriDownload();
    });

    function polyfillDataUriDownload(){
        var links = document.querySelectorAll('a[download], area[download]');
        for (var index = 0, length = links.length; index<length; ++index) {
            (function (link){
                var dataUri = link.getAttribute("href");
                var fileName = link.getAttribute("download");
                if (dataUri.slice(0,5) != "data:")
                    throw new Error("The XHR part is not implemented here.");
                addEvent(link, "click", function (event){
                    cancelEvent(event);
                    try {
                        var dataBlob = dataUriToBlob(dataUri);
                        forceBlobDownload(dataBlob, fileName);
                    } catch (e) {
                        alert(e)
                    }
                });
            })(links[index]);
        }
    }

    function forceBlobDownload(dataBlob, fileName){
        window.navigator.msSaveBlob(dataBlob, fileName);
    }

    function dataUriToBlob(dataUri) {
        if  (!(/base64/).test(dataUri))
            throw new Error("Supports only base64 encoding.");
        var parts = dataUri.split(/[:;,]/),
            type = parts[1],
            binData = atob(parts.pop()),
            mx = binData.length,
            uiArr = new Uint8Array(mx);
        for(var i = 0; i<mx; ++i)
            uiArr[i] = binData.charCodeAt(i);
        return new Blob([uiArr], {type: type});
    }

    function addEvent(subject, type, listener){
        if (window.addEventListener)
            subject.addEventListener(type, listener, false);
        else if (window.attachEvent)
            subject.attachEvent("on" + type, listener);
    }

    function cancelEvent(event){
        if (event.preventDefault)
            event.preventDefault();
        else
            event.returnValue = false;
    }

    function isInternetExplorer(){
        return /*@cc_on!@*/false || !!document.documentMode;
    }

})();
(函数(){
addEvent(窗口,“加载”,功能(){
如果(isInternetExplorer())
polyfillDataUriDownload();
});
函数polyfillDataUriDownload(){
var links=document.querySelectorAll('a[download],area[download]');
对于(var index=0,length=links.length;indexCreated)一个要点:我不确定为什么在循环中使用闭包,但我想它是有目的的。