淺談web存儲

一、先來講說以前的客戶端存儲吧~在html5出來以前~客戶端存儲主要是使用cookie~不過這種古老的方式存在着好一些弊端~舉例以下:html

能夠存儲的數據的大小受到限制~官方指出一個域名下最多能夠存儲4k的數據(有點少吧~~)html5

cookie的數據放到了http請求頭上~這樣不只使得http請求頭變得臃腫~過多的cookie會使請求愈來愈慢~同時還帶來了安全的問題~這玩意默認是明文的web

同時注意cookie是會過時的~編程

二、還有一種存儲方式是userData~可是這個只有ie支持~考慮到平臺的限制~此處再也不贅述~canvas

三、html5出來後~web存儲克服了以前cookie的缺陷~好比大小限制從原來的4k編程了5M~也有很好的跨平臺的支持~下面咱們來看下其主要的方式:瀏覽器

sessionStorage/localStorage:兩者的主要區別是sessionStorage存儲的數據在本次會話窗口被關閉後就沒有了~而localStorage中存儲的數據是長期存在的~除非手動刪除~同時~同一站點下的不一樣的會話窗口(注意~是同一站點~不是同域名~localStorage的數據就算是同一域名下的子域名也不能夠共享)能夠共享localStorage中存儲的數據~再者~Safari瀏覽器還支持localStorage的一個事件~叫storage事件~這個事件是當localStorage中存儲的數據發生變化時被觸發的~利用這個事件~同一站點下的不一樣窗口中localStorage的數據就能夠實現無刷新的同步啦~好比我打開兩個京東的頁面~在第一個頁面把商品加入購物車~第二個頁面無需刷新~購物扯中的數據就會自動更新~無奈~這麼棒的功能目前只有Safar支持~~還有一點須要注意的是這個事件雖然在losalStorage中提出~但這個事件的擁有着是window對象~只要頁面添加了這個事件~window會自動在localStorage中存儲的數據發生變化時觸發同一站點的窗口~而不是同一站點的會話窗口會被忽略~安全

應用:使用localStorage實現圖片的存儲方法:服務器

js代碼:cookie

function saveImg() {
            var myImg = document.createElement("img");
            myImg.src = "http://127.0.0.1/x.jpg";

            //當圖片加載完成的時候觸發回調函數
            myImg.addEventListener("load", function () {
                var imgCanvas = document.createElement("canvas"),
                imgContext = imgCanvas.getContext("2d");
                // 確保canvas元素的大小和圖片尺寸一致
                imgCanvas.width = this.width;
                imgCanvas.height = this.height;

                // 渲染圖片到canvas中
                imgContext.drawImage(this, 0, 0, this.width, this.height);

                // 用data url的形式取出
                var imgAsDataURL = imgCanvas.toDataURL("image/png");

                // 保存到本地存儲中
                try {
                    localStorage.setItem("elephant", imgAsDataURL);
                }
                catch (e) {
                    console.log("Storage failed: " + e);
                }
            }, false);
        }

        function getImg() {
            var imgData = localStorage.getItem("elephant");
            var imgObj = document.createElement("img");
            imgObj.src = imgData;
            document.body.appendChild(imgObj);
        }

注意:由於本地存儲只能存儲字符串~因此這裏使用了canvas來對圖片數據作一個轉換~可是canvas有一個安全策略~當請求的的圖片和當前的頁面不是同一個域名時會報錯~因此這裏我使用xampp搭建了一個服務器~把圖片和測試頁面都丟進去~以此來測試頁面的運行~
session

另外注意一下~使用localStorage前強烈建議先判斷當前瀏覽器是否支持~網上指出的一個通用的方法是if(window.localStorage)~可是這裏建議使用一種更爲健全的方式:即便用上面的方式~直接localStorage.setItem一下~並把這句放到try-catch塊中去執行~若是捕獲到異常~就說明當前的瀏覽器不支持localStorage~那麼咱們直接就換別的方法來作這個存儲啦

 

下面談談localStorage的缺陷~一個是它沒有過時這麼個說法~只要不手動刪除~那數據將會永久保存~若是業務中涉及到數據保存須要設置期限~那咱們能夠本身封裝相應的數據對象到localStorage中來實現~下面是一個實現帶過時效果的localStorage的demo

function saveDataWithDate(key, value) {
            var currentTime = new Date().getTime();
            try    {
                localStorage.setItem(key, JSON.stringify({data: value,time: currentTime}));
            }catch(e) {
                console.log("Storage failed: " + e);
            }
        }

        function getDataWithDate(key, lastTime) {
            //lastTime爲期限
            var data = localStorage.getItem(key);
            var dataObj = JSON.parse(data);
            console.log(dataObj.time);
            if(new Date().getTime() - dataObj.time > lastTime) {
                console.log("數據已過時");
            }else {
                console.log("data is:" + dataObj.data);
            }
        }
相關文章
相關標籤/搜索