解析原来浏览器原生支持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 相关文章推荐
NODE.JS加密模块CRYPTO常用方法介绍
Jun 05 Javascript
Jquery焦点与失去焦点示例应用
Jun 10 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
Mar 25 Javascript
js实现日历的简单算法
Jan 24 Javascript
简单谈谈Javascript函数中的arguments
Feb 09 Javascript
Vuejs实现带样式的单文件组件新方法
May 02 Javascript
详解Node.js串行化流程控制
May 04 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
Oct 25 Javascript
关于redux-saga中take使用方法详解
Feb 27 Javascript
vue配置请求本地json数据的方法
Apr 11 Javascript
Vue.js 2.x之组件的定义和注册图文详解
Jun 19 Javascript
ElementUI中el-tree节点的操作的实现
Feb 27 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
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
php 保留字列表
2012/10/04 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
firefox插件Firebug的使用教程
2010/01/02 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
nodejs实现聊天机器人功能
2019/09/19 NodeJs
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
Python 处理数据的实例详解
2017/08/10 Python
Python字符串的一些操作方法总结
2019/06/10 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
2019/07/04 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
建筑工程自我鉴定
2013/10/18 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
实习单位鉴定意见
2015/06/04 职场文书