解析原来浏览器原生支持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 相关文章推荐
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
Aug 14 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
Oct 20 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
Feb 23 Javascript
JS实现超简单的鼠标拖动效果
Nov 02 Javascript
深入理解jQuery中的事件冒泡
May 24 Javascript
AngularJS基础 ng-open 指令简单实例
Aug 02 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
Jan 03 Javascript
基于JavaScript实现滑动门效果
Mar 16 Javascript
Vue.js实现表格渲染的方法
Sep 07 Javascript
React组件对子组件children进行加强的方法
Jun 23 Javascript
详解vue3.0 diff算法的使用(超详细)
Jul 01 Javascript
javascript前端和后台进行数据交互方法示例
Aug 07 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
substr()函数中文版
2006/10/09 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
phpmyadmin 3.4 空密码登录的实现方法
2010/05/29 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
PHP的PSR规范中文版
2013/09/28 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
Jquery插件之多图片异步上传
2010/10/20 Javascript
JQuery之拖拽插件实现代码
2011/04/14 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
如何使用json在前后台进行数据传输实例介绍
2013/04/11 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
Django admin美化插件suit使用示例
2017/12/12 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
Python生成器generator用法示例
2018/08/10 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js