JS实现弹出下载对话框及常见文件类型的下载

  

  

JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个一个标签,并将其href指向生成的URL,然后触发一个标签的单击事件,这样就会弹出下载对话框,从而实现了一个下载的功能。

  

这里所说的下载,有时候也可以理解为保存。出于安全考虑,JS肯定无法直接调用FileAPI写文件到磁盘,但是却可以通过下载来变相实现保存功能。

  

  

  

既然是用一个标签模拟,那么肯定要知道JS如何主动触发单击事件。

  

最简单的触发单击事件肯定是elem.click(),平时在不需要考虑兼容性的场合我都是这么干的,但是毕竟这个方法有兼容性(具体兼容性如何没做过测试),所以还是要掌握一个通用的方法。

  

以下代码是网上比较容易找到的一段代码,我在前面加了一段MouseEvent的判断:

     /* *   *触发单击事件   * @param elem需要触发事件的DOM对象   */函数fireClickEvent (elem)   {   var事件;   如果(window.MouseEvent)事件=new MouseEvent(“点击”);   其他的   {   事件=document.createEvent (“mouseevent”);   事件。initMouseEvent(“单击”,真的,假的,窗口,0,0,0,0,0,假的,假的,假的,假的,0,null);   }   elem.dispatchEvent(事件);   }      

  

这个属性很重要,它可以指定下载文件名,并且可以告诉浏览器目标链接是一个下载链接,不是一个普通链接,我们看下面代码就能看出区别了:

        & lt; a href="数据:文本/txt; charset=utf - 8,测试下载纯文本“rel=巴獠縩ofollow”rel=巴獠縩ofollow”rel=巴獠縩ofollow”下载="测试。txt”祝辞下载1 & lt;/a>   & lt; a href="数据:文本/txt; charset=utf - 8,测试下载纯文本“rel=巴獠縩ofollow”rel=巴獠縩ofollow”rel=巴獠縩ofollow”祝辞下载2 & lt;/a>      

可以发现,下载1按钮能够实现下载,点击下载2链接时直接在浏览器打开文件内容了。

  

  

文件:///模式下貌似不生效;

  

链接指向一些第三方链接时也不会生效,具体有待研究,

  

  

假如给我们的不是一个下载地址而是一个团对象,我们可以通过URL.createObjectURL来给团对象生成临时URL,并且可以利用HTML5的下载属性来指定下载的文件名,好家伙,有了这2个东西我们就可以实现一个“万”能的弹出下载对话框方法了。

  

综上所述,我又在fireClickEvent的基础上继续简单封装了一个openDownloadDialog方法,使用如下:

        saveName openDownloadDialog (url)   saveName openDownloadDialog (blob)      

代码如下:

     /* *   *通用的打开下载对话框方法,没有测试过具体兼容性   * @param url下载地址,也可以是一个团对象,必选   * @param saveName保存文件名,可选   */函数openDownloadDialog (url, saveName)   {   如果(typeof url==韵蟆?,url instanceof Blob)   {   url=URL.createObjectURL (url);//创建团地址   }   var aLink=document.createElement (' a ');   aLink。href=https://www.yisu.com/zixun/url;   aLink。下载=saveName | |”;//HTML5新增的属性,指定保存文件名,可以不要后缀,注意,文件:///模式下不会生效   var事件;   如果(window.MouseEvent)事件=new MouseEvent(“点击”);   其他的   {   事件=document.createEvent (“mouseevent”);   事件。initMouseEvent(“单击”,真的,假的,窗口,0,0,0,0,0,假的,假的,假的,假的,0,null);   }   aLink.dispatchEvent(事件);   }      

  

  

csv是一种逗号分隔的表格文件格式,可以很好的被Excel支持,由于其文件格式简单,所以经常用在简单的表格上面。最重要的是它是一种纯文本格式,可以很轻松地用JS来生成而不借助第三方库。

  

<强> 3.1.1。CSV格式示例

  

如下:         姓,名期中成绩,期末成绩   58岁的张三95   李四、98、74   38岁的王二,47岁   刘能,15100   黄五、87、68      

excel打开效果如下:

  

 JS实现弹出下载对话框及常见文件类型的下载

  

<强> 3.1.2。初次尝试

  

首先想到的是使用数据:文本/txt;来实现,先看一下下载纯文本:

        & lt;下载="测试。txt " href="数据:文本/txt; charset=utf - 8,测试下载纯文本“rel="外部nofollow”rel="外部nofollow”rel="外部nofollow”祝辞下载& lt;/a>

JS实现弹出下载对话框及常见文件类型的下载