【高級功能】使用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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...