博主信息
离乄殇的博客
博文
1
粉丝
0
评论
0
访问量
6811
积分:0
P豆:0

JS前端创建标签文本或json文件保存到本地

2017年07月24日 14:37:25阅读数:6820博客 / 离乄殇的博客/ 前端积累

这篇文章发布于 2017年07月5日,星期三,02:03,归类于 js实例。 阅读 3776 次, 今日 57 次

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=6252
本文可全文转载,但需得到原作者书面许可,同时保留原作者和出处,摘要引流则随意。

一、HTML与文件***

如果希望在前端侧直接触发某些资源的***,最方便快捷的方法就是使用HTML5原生的download属性,例如:

<a href="large.jpg" download>***</a>

具体介绍可参考我之前的文章:“了解HTML/HTML5中的download属性”。

但显然,如果纯粹利用HTML属性来实现文件的***(而不是浏览器打开或浏览),对于动态内容,就无能为力。

例如,我们对页面进行分享的时候,希望分享图***是页面内容的实时截图,此时,这个图***就是动态的,纯HTML显然是无法满足我们的需求的,借助JS和其它一些HTML5特性,例如,将页面元素转换到canvas上,然后再转成图***进行***。

但本文要介绍的***不是图***的***,而是文本信息的***,所需要使用的HTML特性不是canvas,而是其它。

二、借助HTML5 Blob实现文本信息文件***

如果对Blob不了解,可以先看看我好些年之前写的“理解DOMString、Document、FormData、Blob、File、ArrayBuffer数据类型”一文。

原理其实很简单,我们可以将文本或者JS字符串信息借助Blob转换成二进制,然后,作为<a>元素的href属性,配合download属性,实现***。

代码也比较简单,如下示意(兼容Chrome和Firefox):

var funDownload = function (content, filename) {    // 创建隐藏的可***链接
   var eleLink = document.createElement('a');
   eleLink.download = filename;
   eleLink.style.display = 'none';    // 字符内容转变成blob地址
   var blob = new Blob([content]);
   eleLink.href = URL.createObjectURL(blob);    // 触发点击
   document.body.appendChild(eleLink);
   eleLink.click();    // 然后移除
   document.body.removeChild(eleLink);
};

其中,content指需要***的文本或字符串内容,filename指***到系统中的文件名称。

万般言语不达意,一枚实例来走心。

您可以狠狠地点击这里:基于funDownload实现的html格式文件***demo

点击“***”按钮,会把文本域中的内容全部作为一个.html后缀文件***下来,各流程效果如下面几张图:


出现***确认框(根据浏览器的设置不同也可能直接***),然后名称默认就是test.html。


然后对应保存目录就多了个类似下图的文件:


双击该test.html文件可以在浏览器中正常浏览,说明,保存信息无误。


触发***的JS代码就几行:

button.addEventListener('click', function () {
   funDownload(textarea.value, 'test.html');
});

以上~

三、结束语

不止是.html文件,.txt, .json等只要内容是文本的文件,都是可以利用这种小技巧实现***的。

在Chrome浏览器下,模拟点击创建的<a>元素即使不append到页面中,也是可以触发***的,但是在Firefox浏览器中却不行,因此,上面的funDownload()方法有一个appendChild和removeChild的处理,就是为了兼容Firefox浏览器。

download属性从Edge13开始支持,理论上,edge也应该支持直接JS触发的浏览器文件***,但我手头上并无相关浏览器,无法确定真实情况如何,欢迎有条件的小伙伴帮忙测下告知结果。

就这些吧,感谢阅读!



版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
氟西汀
  • 氟西汀· 2019-11-29 11:34:441楼
  • 怎么不提示下载框,然后文件自动保存在当前的html同级目录下呢

  • 回复