解析原來瀏覽器原生支持JS Base64編碼解碼
上次給大家分享了如何用js實(shí)現(xiàn)剪切板粘貼上傳圖片,今天跟大家分享下JS Base64編碼解碼。
1. 基礎(chǔ)不牢,選型糟糕
糟糕的技術(shù)選型往往源自自身技術(shù)廣度不足。就在數(shù)月前,一個(gè)前端HTML字符信息轉(zhuǎn)Base64的需求,我是毫不猶豫去找了個(gè)開源的base64.js。使用很簡單,瀏覽器引入該JS文件,然后Base64編碼這樣:
解碼就調(diào)用decode方法,如下:
數(shù)據(jù)準(zhǔn)確,功能良好。當(dāng)時(shí)弄完還洋洋得意,以為是個(gè)完美的解決。結(jié)果,今天發(fā)現(xiàn),尼瑪原來瀏覽器很早就支持了JS Base64加密解密,而上面這種洋洋得意的做法完全就是瞎子點(diǎn)燈——白費(fèi)蠟!根本就不是一個(gè)好的技術(shù)選型。
由于技術(shù)廣度掌握不足,或者說JS基礎(chǔ)掌握不牢,導(dǎo)致浪費(fèi)了大把時(shí)間去找Base64的JS語言庫,學(xué)習(xí)其API用法,換來一個(gè)冗余完全不需要加載的JS,現(xiàn)在來看,真是個(gè)糟糕的技術(shù)選型。
2. 原生atob和btoa方法
實(shí)際上,從IE10+瀏覽器開始,所有瀏覽器就原生提供了Base64編碼解碼方法,不僅可以用于瀏覽器環(huán)境,Service Worker環(huán)境也可以使用。
方法名就是atob和btoa,具體語法如下:
1)Base64解碼
語法為(瀏覽器中):
var decodedData = window.atob(encodedData);
或者(瀏覽器或js Worker線程中):
var decodedData = self.atob(encodedData);
例如:
window.atob('emhhbmd4aW54dQ=='); // 返回:'zhangxinxu'
atob這個(gè)方法名稱乍一看,很奇怪,不知道這個(gè)單詞什么意思。我們可以理解為 A to B,也就是從A到B。這里的B指的就是Base64嗎?哈哈哈,恭喜你!猜錯(cuò)了!A指的才是Base64,反的,B才是普通字符,普通意思就是low,俗稱low B。所以我們這么記憶,Low B,Low B,B表示很Low的普通字符,A才是Base64,和首字母對(duì)應(yīng)關(guān)系是反的。
因此,atob表示Base64字符to普通字符,也就是Base64解碼。
2)Base64編碼
語法為(瀏覽器中):
var encodedData = window.btoa(stringToEncode);
或者(瀏覽器或js Worker線程中):
var encodedData = self.btoa(stringToEncode);
例如:
window.btoa('zhangxinxu'); // 返回:'emhhbmd4aW54dQ=='
btoa這個(gè)方法名稱乍一看,很奇怪,不知道這個(gè)單詞什么意思。我們可以理解為 B to A,也就是從B到A。那B指什么,A指什么呢?和atob方法一樣,B指的是low B普通字符串,A指的是Base64字符。
因此,btoa方法表示low B普通字符to Base64字符,也就是Base64編碼。
3. IE8/IE9的polyfill
當(dāng)下,仍有不少PC項(xiàng)目還需要兼容IE9,所以,我們可以專門針對(duì)這些瀏覽器再引入一段ployfill腳本或者一個(gè)JS文件即可。
實(shí)際使用,我們可以借助IE條件注釋無縫對(duì)接。也就是HTML中嵌入下面一段代碼:
[if IE]表示所有IE瀏覽器,由于IE10+瀏覽器已經(jīng)放棄了著名的IE條件注釋的支持,Chrome等瀏覽器本身就不支持這個(gè)IE私有語法,因此,很天然的,上面一段script引入只在IE9-瀏覽器下有效。而我們本來就希望只IE8,IE9瀏覽器引入ployfill,于是正好完美銜接上。
也就是原生支持atob和btoa方法的瀏覽器認(rèn)為就是一段無需關(guān)心的HTML注釋,不支持atob和btoa的IE9及其以下瀏覽器則會(huì)加載我們的base64-polyfill.js,使瀏覽器也支持window.btoa和window.atob這個(gè)語法。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
layer.open屬性詳解及l(fā)ayer.open彈出框使用post方法舉例
這篇文章主要給大家介紹了關(guān)于layer.open屬性詳解及l(fā)ayer.open彈出框使用post方法的相關(guān)資料,最近接觸到layer彈窗,感覺彈窗功能異常強(qiáng)大,真的很方便,所以記錄下來,需要的朋友可以參考下2023-12-12JS實(shí)現(xiàn)訪問DOM對(duì)象指定節(jié)點(diǎn)的方法示例
這篇文章主要介紹了JS實(shí)現(xiàn)訪問DOM對(duì)象指定節(jié)點(diǎn)的方法,結(jié)合實(shí)例形式分析了javascript針對(duì)DOM元素節(jié)點(diǎn)屬性相關(guān)操作技巧,需要的朋友可以參考下2018-04-04JS forEach跳出循環(huán)2種實(shí)現(xiàn)方法
這篇文章主要介紹了JS forEach跳出循環(huán)2種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Javascript showModalDialog兩個(gè)窗體之間傳值
前一篇文章Javascript怎么在兩個(gè)窗體之間傳值中講到了如何利用window.open()方法打開新窗體,并在兩個(gè)窗體之間傳值的方法。2009-09-09js實(shí)現(xiàn)非常簡單的焦點(diǎn)圖切換特效實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)非常簡單的焦點(diǎn)圖切換特效,是一個(gè)非常簡單的js焦點(diǎn)圖切換效果,涉及javascript操作鼠標(biāo)事件與圖片的相關(guān)技巧,需要的朋友可以參考下2015-05-05JS實(shí)現(xiàn)select選中option觸發(fā)事件操作示例
這篇文章主要介紹了JS實(shí)現(xiàn)select選中option觸發(fā)事件操作,結(jié)合實(shí)例形式總結(jié)分析了javascript針對(duì)select下拉選中option項(xiàng)觸發(fā)事件相關(guān)操作技巧,需要的朋友可以參考下2018-07-07IFrame跨域高度自適應(yīng)實(shí)現(xiàn)代碼
最近在做項(xiàng)目中,遇到一個(gè)問題,就是iframe高度的自適應(yīng)問題,以下是解決辦法2012-08-08