【温故而知新-Javascript】使用Web存储

简介:

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"></iframe></div>
<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>
复制代码

其演示效果如下:






本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/5928075.html,如需转载请自行联系原作者
目录
相关文章
|
11天前
|
存储 Web App开发 移动开发
HTML5 Web 存储详解
HTML5 Web存储提供了两种客户端数据存储机制:**Local Storage**和**Session Storage**。Local Storage用于长期存储数据,即使关闭浏览器数据也依然存在,适用于保存用户偏好设置等信息。Session Storage则在标签或窗口关闭时清除数据,适合存储临时信息。两者均提供了简单的API进行数据的存取操作,但需要注意的是,Web存储并非加密存储,不应存放敏感信息。现代浏览器普遍支持Web存储,合理利用这两种存储方式可提升Web应用的用户体验。
|
1月前
|
数据采集 Web App开发 JavaScript
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
随着互联网的发展,网页数据抓取已成为数据分析和市场调研的关键手段。Puppeteer是一款由Google开发的无头浏览器工具,可在Node.js环境中模拟用户行为,高效抓取网页数据。本文将介绍如何利用Puppeteer的高级功能,通过设置代理IP、User-Agent和Cookies等技术,实现复杂的Web Scraping任务,并提供示例代码,展示如何使用亿牛云的爬虫代理来提高爬虫的成功率。通过合理配置这些参数,开发者可以有效规避目标网站的反爬机制,提升数据抓取效率。
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
|
2月前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
110 0
|
2月前
|
存储 JavaScript NoSQL
构建高效Web应用:使用Node.js和Express框架
【8月更文挑战第30天】本文将引导你了解如何使用Node.js和Express框架快速搭建一个高效的Web应用。通过实际的代码示例,我们将展示如何创建一个简单的API服务,并讨论如何利用中间件来增强应用功能。无论你是新手还是有经验的开发者,这篇文章都将为你提供有价值的见解。
|
18天前
|
数据采集 存储 JavaScript
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
在现代Web开发中,数据采集尤为重要,尤其在财经领域。本文以“东财股吧”为例,介绍如何使用Puppeteer结合代理IP技术进行高效的数据抓取。Puppeteer是一个强大的Node.js库,支持无头浏览器操作,适用于复杂的数据采集任务。通过设置代理IP、User-Agent及Cookies,可显著提升抓取成功率与效率,并以示例代码展示具体实现过程,为数据分析提供有力支持。
Puppeteer的高级用法:如何在Node.js中实现复杂的Web Scraping
|
4天前
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
|
10天前
|
存储 移动开发 缓存
HTML5 Web 存储详解
HTML5 Web 存储包括 `localStorage` 和 `sessionStorage`,前者提供持久存储且无过期时间,后者仅在会话期间有效。两者均支持键值对形式存储数据,容量约为 5-10 MB。`localStorage` 适用于用户偏好设置、登录状态保持及离线应用缓存;`sessionStorage` 则用于临时数据如表单输入。数据以字符串形式存储,可通过 `JSON` 方法处理对象。由于数据存储于本地,不适合存放敏感信息。示例代码展示了如何使用按钮将输入框内容保存至 `localStorage` 并进行清除操作。
|
14天前
|
Web App开发 JavaScript 前端开发
构建高效Web应用:Node.js与Express框架的深度整合
【9月更文挑战第28天】在现代Web开发领域,Node.js和Express框架的结合已成为打造高性能、易扩展应用的黄金组合。本文将深入探讨如何利用这一技术栈优化Web应用架构,提供具体实践指导,并分析其性能提升的内在机制。通过代码示例,我们将展示从基础搭建到高级功能的实现过程,旨在为开发者提供一条清晰的学习路径,以实现技术升级和项目效率的双重提升。
35 3
|
19天前
|
移动开发 JavaScript 数据可视化
|
1天前
|
开发框架 JavaScript 前端开发
使用 Node.js 和 Express 构建 Web 应用
【10月更文挑战第2天】使用 Node.js 和 Express 构建 Web 应用