【高級功能】使用Web存儲

来源:http://www.cnblogs.com/luka/archive/2016/09/02/5832791.html
-Advertisement-
Play Games

Web存儲允許我們在瀏覽器里保存簡單的鍵/值數據。Web存儲和cookie很相似,但它有著更好的實現方式,能保存的數據量也很大。這兩種類型共用相同的機制,但是被保存數據的可見性和壽命存在區別。 PS:還有一種存儲規範名為“索引資料庫API”(Indexed Database API),它允許保存富格 ...


Web存儲允許我們在瀏覽器里保存簡單的鍵/值數據。Web存儲和cookie很相似,但它有著更好的實現方式,能保存的數據量也很大。這兩種類型共用相同的機制,但是被保存數據的可見性和壽命存在區別。

PS:還有一種存儲規範名為“索引資料庫API”(Indexed Database API),它允許保存富格式數據和進行SQL風格的查詢。

 

1.使用本地存儲

我們可以通過全局屬性 localStorage訪問本地存儲功能。這個屬性會返回一個Storage 對象,下表對其進行了介紹。Storage 對象被用來保存鍵/值形式的字元串對。

Storage 對象可用來存儲鍵/值對,其中鍵和值都是字元串。鍵必須是惟一的,這就意味著如果我們用 Storage對象里已經存在的鍵調用setItem方法,就會更新它的值。下麵的示例展示瞭如何添加、修改和清除本地存儲中數據。

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用本地存儲</title>
    <style>
        body > * {float: left;}
        table {border-collapse: collapse;margin-left:50px; }
        th,td {padding: 4px;}
        th {text-align: right;}
        input {border: thin solid black;padding: 2px;}
        label {min-width: 50px;display: inline-block;text-align: right;}
        #countmsg,#buttons {margin-left: 50px;margin-top: 5px;margin-bottom: 5px;}
    </style>
</head>
<body>
<div>
    <div><label>Key:</label><input id="key" placeholder="Enter Key" /></div>
    <div><label>Value:</label><input id="value" placeholder="Enter Value" /></div>
    <div id="buttons">
        <button id="add">Add</button>
        <button id="clear">Clear</button>
    </div>
    <p id="countmsg">These are <span id="count"></span> items </p>
</div>
<table id="data" border="1">
    <tr><th>Item Count:</th><td id="count">-</td> </tr>
</table>
<script>
    displayData();
    var buttons = document.getElementsByTagName("button");
    for(var i=0;i<buttons.length;i++){
        buttons[i].onclick = handleButtonPress;
    }
    function handleButtonPress(e){
        switch (e.target.id){
            case 'add':
                var key = document.getElementById("key").value;
                var value = document.getElementById("value").value;
                localStorage.setItem(key,value);
                displayData();
                break;
            case 'clear':
                localStorage.clear();
                displayData();
                break;
        }
    }
    function displayData(){
        var tableElem = document.getElementById("data");
        tableElem.innerHTML = "";
        var itemCount = localStorage.length;
        document.getElementById("count").innerHTML = itemCount;
        for(var i=0;i<itemCount;i++){
            var key = localStorage.key(i);
            var val = localStorage[key];
            tableElem.innerHTML += "<tr><th>" + key + ":</th><td>" + val + "</td></tr>";
        }
    }
</script>
</body>
</html>

此例報告了本地存儲中的項目數量,並枚舉已保存的鍵/值對來填充一個表格元素。這裡添加了兩個button元素,在Add按鈕被按下時將他們的內容保存為項目。在響應Clear按鈕時,會清除本地存儲中的內容。其顯示效果如下:

瀏覽器不會刪除我們用 localStorage對象添加的數據,除非用戶自己清除瀏覽數據。

 

監聽存儲事件

通過本地存儲功能保存的數據對所有來源相同的文檔都是可用的。某個文檔對本地存儲進行修改時會觸發storage事件,我們可以監聽其他同源文檔上的這個事件來確保我們能跟上最新的變化。

與storage事件同時指派的對象是一個StorageEvent對象,它的成員如下表所示:

下麵的示例展示了一個文檔,它會監聽並編錄本地存儲對象上觸發的事件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>編錄本地存儲事件</title>
    <style>
        table {border-collapse:collapse; }
        th,td {padding: 4px;}
    </style>
</head>
<body>
<table id="data" border="1">
    <tr>
        <th>key</th>
        <th>oldValue</th>
        <th>newValue</th>
        <th>url</th>
        <th>storageArea</th>
    </tr>
</table>
<script>
    var tableElem = document.getElementById("data");
    window.onstorage = handleStorage;
    function handleStorage(e){
        var row = "<tr>";
        row += "<td>" + e.key + "</td>";
        row += "<td>" + e.oldValue + "</td>";
        row += "<td>" + e.newValue + "</td>";
        row += "<td>" + e.url + "</td>";
        row += "<td>" + (e.storageArea == localStorage) + "</td>";
        row += "</tr>";
        tableElem.innerHTML += row;
    }
</script>
</body>
</html>

storage事件是通過Window對象觸發的,此對象可以來自共用被改動存儲的任何一個文檔。此例中,每次接收到事件時都會給table元素添加一個新行,演示效果如下:

 

圖中的事件展示了給本地存儲添加新項目的過程。url屬性能幫助我們瞭解是哪個文檔觸發了變化。storageArea屬性會返回發生變化的Storage對象,它可以是本地或會話存儲對象。此例只接收來自本地存儲對象的事件。

PS:這些事件不會再製造變化的文檔內指派。

 

2. 使用會話存儲

會話存儲(session storage)的工作方式和本地存儲很接近,不同之處在於數據是各個瀏覽上下文私有的,會在文檔被關閉時移除。我們通過全局變數 sessionStorage訪問會話存儲,它會返回一個Storage對象。下麵的例子展示了會話存儲的用法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用會話存儲</title>
    <style>
        body > * {float: left;}
        table {border-collapse: collapse;margin-left:50px; }
        th,td {padding: 4px;}
        th {text-align: right;}
        input {border: thin solid black;padding: 2px;}
        label {min-width: 50px;display: inline-block;text-align: right;}
        #countmsg,#buttons {margin-left: 50px;margin-top: 5px;margin-bottom: 5px;}
    </style>
</head>
<body>
<div>
    <div><label>Key:</label><input id="key" placeholder="Enter Key" /></div>
    <div><label>Value:</label><input id="value" placeholder="Enter Value" /></div>
    <div id="buttons">
        <button id="add">Add</button>
        <button id="clear">Clear</button>
    </div>
    <p id="countmsg">These are <span id="count"></span> items </p>
</div>
<table id="data" border="1">
    <tr><th>Item Count:</th><td id="count">-</td> </tr>
</table>
<script>
    displayData();
    var buttons = document.getElementsByTagName("button");
    for(var i=0;i<buttons.length;i++){
        buttons[i].onclick = handleButtonPress;
    }
    function handleButtonPress(e){
        switch (e.target.id){
            case 'add':
                var key = document.getElementById("key").value;
                var value = document.getElementById("value").value;
                sessionStorage.setItem(key,value);
                displayData();
                break;
            case 'clear':
                sessionStorage.clear();
                displayData();
                break;
        }
    }
    function displayData(){
        var tableElem = document.getElementById("data");
        tableElem.innerHTML = "";
        var itemCount = sessionStorage.length;
        document.getElementById("count").innerHTML = itemCount;
        for(var i=0;i<itemCount;i++){
            var key = sessionStorage.key(i);
            var val = sessionStorage[key];
            tableElem.innerHTML += "<tr><th>" + key + ":</th><td>" + val + "</td></tr>";
        }
    }
</script>
</body>
</html>

此例的工作方式和前面本地存儲的例子很接近,不同之處在於可見性和壽命受到限制。這些限制會影響storage事件的處理方式:前面提到的storage事件只會在共用存儲的文檔中觸發。對於會話存儲,這就意味著事件只會在內嵌文檔中觸發,比如 iframe里的文檔。修改前一示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用會話存儲的storage事件</title>
    <style>
        body > * {float: left;}
        table {border-collapse: collapse;margin-left:50px; }
        th,td {padding: 4px;}
        th {text-align: right;}
        input {border: thin solid black;padding: 2px;}
        label {min-width: 50px;display: inline-block;text-align: right;}
        #countmsg,#buttons {margin-left: 50px;margin-top: 5px;margin-bottom: 5px;}
        iframe {clear: left;}
    </style>
</head>
<body>
<div>
    <div><label>Key:</label><input id="key" placeholder="Enter Key" /></div>
    <div><label>Value:</label><input id="value" placeholder="Enter Value" /></div>
    <div id="buttons">
        <button id="add">Add</button>
        <button id="clear">Clear</button>
    </div>
    <p id="countmsg">These are <span id="count"></span> items </p>
</div>
<table id="data" border="1">
    <tr><th>Item Count:</th><td id="count">-</td> </tr>
</table>
<br />
<iframe src="storage-02.html" width="666" height="222"><

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • domManip 這個函數的歷史由來已久,從 jQuery 1.0 版本開始便存在了,一直到最新的 jQuery 版本。可謂是元老級工具函數。 domManip 的主要功能是為了實現 DOM 的插入和替換。具體共為以下 5 個函數服務 內部後插入(append) 內部前插入(prepend) 外部前 ...
  • 先知BOM,再知DOM BOM <a href="#">BOM</a> DOM* <a href="#">DOM</a> javaScript中的DOM操作 jQuery中的DOM操作 java中的DOM操作 基於JavaScript的DOM操作 DOM:文檔對象模型,文檔可以是.xml .html ...
  • 作為當代前端,前後端的界限越來越小,要想走的更穩,學習Linux操作系統的相關知識是必不可少的。 為什麼伺服器端採用linux操作系統? 1.linux相對於windows的性能更加穩定 2.前期投入成本低,相比於windows的伺服器產品,linux是完全開源免費的,linux支持最小化安裝,在相 ...
  • 一、圖片格式為png 1.shift+按住滑鼠左鍵,拉出參考線。 2.使用切片工具切出圖片 3.導出圖片:文件-儲存為web所用格式-預設(png-24)-選中需要導出圖片-點擊儲存-切片(選中用戶的所有切片)-保存(保存在桌面上) 二、圖片格式為psd 1.新建一個文檔 2.圖層中找到需要的圖層- ...
  • gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson05 一 過濾器寫法 {{ message | Filter}} 二 Vue自帶的過濾器:capitalize 功能:首字母大寫 上面代碼輸出:Abc 三 Vue自帶的過 ...
  • HTML <b> 標簽 所有瀏覽器都支持 <b> 標簽。 定義和用法 <b> 標簽規定粗體文本。 所有瀏覽器都支持 <b> 標簽。 定義和用法 <b> 標簽規定粗體文本。 定義和用法 <b> 標簽規定粗體文本。 註釋:根據 HTML5 規範,在沒有其他合適標簽更合適時,才應該把 <b> 標簽作為最後 ...
  • 我的第一篇博客 ——JS的那些基礎概念 接觸前端已經整整一學年了,這是我第一次寫博客,感覺心裡裝了無數只兔子,很緊張,很激動,也很興奮。 第一次寫,也不知道有沒有什麼套路,需不需要註意文采之類的。不管了,太激動了,我就直接寫只要內容吧!下麵是我總結的一些關於JS的基礎概念: 【變數】從字面上面,變數 ...
  • 在典型的面向對象的語言中,如java,都存在類(class)的概念,類就是對象的模板,對象就是類的實例。但是在Javascript語言體系中,是不存在類(Class)的概念的,javascript中不是基於‘類的’,而是通過構造函數(constructor)和原型鏈(prototype chains ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...