解析原来浏览器原生支持JS Base64编码解码


Posted in Javascript onAugust 12, 2019

上次给大家分享了如何用js实现剪切板粘贴上传图片,今天跟大家分享下JS Base64编码解码。

1. 基础不牢,选型糟糕

糟糕的技术选型往往源自自身技术广度不足。就在数月前,一个前端HTML字符信息转Base64的需求,我是毫不犹豫去找了个开源的base64.js。使用很简单,浏览器引入该JS文件,然后Base64编码这样:

解析原来浏览器原生支持JS Base64编码解码

解码就调用decode方法,如下:

解析原来浏览器原生支持JS Base64编码解码

数据准确,功能良好。当时弄完还洋洋得意,以为是个完美的解决。结果,今天发现,尼玛原来浏览器很早就支持了JS Base64加密解密,而上面这种洋洋得意的做法完全就是瞎子点灯——白费蜡!根本就不是一个好的技术选型。

由于技术广度掌握不足,或者说JS基础掌握不牢,导致浪费了大把时间去找Base64的JS语言库,学习其API用法,换来一个冗余完全不需要加载的JS,现在来看,真是个糟糕的技术选型。

2. 原生atob和btoa方法

实际上,从IE10+浏览器开始,所有浏览器就原生提供了Base64编码解码方法,不仅可以用于浏览器环境,Service Worker环境也可以使用。

方法名就是atob和btoa,具体语法如下:

1)Base64解码

语法为(浏览器中):

var decodedData = window.atob(encodedData);

或者(浏览器或js Worker线程中):

var decodedData = self.atob(encodedData);

例如:

window.atob('emhhbmd4aW54dQ==');

// 返回:'zhangxinxu'

atob这个方法名称乍一看,很奇怪,不知道这个单词什么意思。我们可以理解为 A to B,也就是从A到B。这里的B指的就是Base64吗?哈哈哈,恭喜你!猜错了!A指的才是Base64,反的,B才是普通字符,普通意思就是low,俗称low B。所以我们这么记忆,Low B,Low B,B表示很Low的普通字符,A才是Base64,和首字母对应关系是反的。

因此,atob表示Base64字符to普通字符,也就是Base64解码。

2)Base64编码

语法为(浏览器中):

var encodedData = window.btoa(stringToEncode);

或者(浏览器或js Worker线程中):

var encodedData = self.btoa(stringToEncode);

例如:

window.btoa('zhangxinxu');

// 返回:'emhhbmd4aW54dQ=='

btoa这个方法名称乍一看,很奇怪,不知道这个单词什么意思。我们可以理解为 B to A,也就是从B到A。那B指什么,A指什么呢?和atob方法一样,B指的是low B普通字符串,A指的是Base64字符。

因此,btoa方法表示low B普通字符to Base64字符,也就是Base64编码。

3. IE8/IE9的polyfill

当下,仍有不少PC项目还需要兼容IE9,所以,我们可以专门针对这些浏览器再引入一段ployfill脚本或者一个JS文件即可。

实际使用,我们可以借助IE条件注释无缝对接。也就是HTML中嵌入下面一段代码:

解析原来浏览器原生支持JS Base64编码解码

[if IE]表示所有IE浏览器,由于IE10+浏览器已经放弃了著名的IE条件注释的支持,Chrome等浏览器本身就不支持这个IE私有语法,因此,很天然的,上面一段script引入只在IE9-浏览器下有效。而我们本来就希望只IE8,IE9浏览器引入ployfill,于是正好完美衔接上。

也就是原生支持atob和btoa方法的浏览器认为就是一段无需关心的HTML注释,不支持atob和btoa的IE9及其以下浏览器则会加载我们的base64-polyfill.js,使浏览器也支持window.btoa和window.atob这个语法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
Sep 19 Javascript
JS焦点图切换,上下翻转
May 12 Javascript
图片onload事件触发问题解决方法
Jul 31 Javascript
js树插件zTree获取所有选中节点数据的方法
Jan 28 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
JS获取随机数和时间转换的简单实例
Jul 10 Javascript
Angular2生命周期钩子函数的详细介绍
Jul 10 Javascript
详解webpack require.ensure与require AMD的区别
Dec 13 Javascript
解决Layui 表单提交数据为空的问题
Aug 15 Javascript
使用Vue.observable()进行状态管理的实例代码详解
May 26 Javascript
微信小程序wx.request的简单封装
Nov 13 Javascript
JavaScript 实现轮播图特效的示例
Nov 05 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
Aug 12 #Javascript
微信小程序实现页面跳转传递参数(实体,对象)
Aug 12 #Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 #Javascript
node命令行工具之实现项目工程自动初始化的标准流程
Aug 12 #Javascript
五分钟搞懂Vuex实用知识(小结)
Aug 12 #Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 #Javascript
Angular8基础应用之表单及其验证
Aug 11 #Javascript
You might like
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
php基于PDO连接MSSQL示例DEMO
2016/07/13 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
微信+angularJS的SPA应用中用router进行页面跳转,jssdk校验失败问题解决
2016/09/09 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
浅谈javascript中遇到的字符串对象处理
2016/11/18 Javascript
js css自定义分页效果
2017/02/24 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
离婚协议书应该怎么写
2014/10/12 职场文书
公司欠款证明
2015/06/24 职场文书
学风建设主题班会
2015/08/17 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers