html5指南--5.使用web storage

简介:   本节课的内容是介绍web storage,使用它在浏览器里存储键值对的数据,功能上像以前的cookie一样,不过他更好,存储的数据可以更大。有两种类型的web storage:local storage和session storage,他们使用相同的实现机制,只是可见性和生命周期不同。

  本节课的内容是介绍web storage,使用它在浏览器里存储键值对的数据,功能上像以前的cookie一样,不过他更好,存储的数据可以更大。有两种类型的web storage:local storage和session storage,他们使用相同的实现机制,只是可见性和生命周期不同。

  1.使用local storage

  我们使用localStorage对象来访问local storage,他返回Storage对象,Storage用来存储键值对的数据,他有下面一些属性和方法:

clear():清楚存储的键值对数据;

getItem(<key>):通过key获取value值;

key(<index>):通过索引获取key值;

length:返回键值对的个数;

removeItem(<key>):通过key移出指定数据;

setItem(<key>,<value>):添加一个键值对,当指定key的键值对存在,则实现更新操作;

[<key>]:通过数组下标的方式,使用key获取指定value值。

  

  Storage对象允许我们存储key和value都是字符串形式的键值对数据,key是唯一的,意味着当我们使用setItem方法添加键值对时,如果key值已经存在的话,将实现更新的操作。我们来看下面的例子:

<!DOCTYPE HTML>
<html>
<head>
    <title>Example</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">There 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);
                    break;
                case 'clear':
                    localStorage.clear();
                    break;
            }
            displayData();
        }

        function displayData() {
            var tableElement = document.getElementById('data');
            tableElement.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.getItem(key);
                tableElement.innerHTML += '<tr><th>' + key + ':</th><td>' + val + '</td></tr>';
            }
        }
    </script>
</body>
</html>

  我们来看运行结果:

  浏览器不能删除我们通过localStorage创建的数据,除非用户删除它。


  2.监听Storage事件

  通过local storage存储的数据对同源的文档具有可见性,比如你打开两个chrome浏览器访问同一个url地址,在任何一个页面上创建的local storage对另外一个页面也是可见的。但是如果用别的浏览器(如firefox)打开相同url地址,local storage是不可见的,因为他们不同源了。Storage事件就是用来监听storage的内容发生改变的,下面我们看他包含哪些属性:

key:返回发生改变的key值;

oldValue:返回发生改变key值以前的value值;

newValue:返回发生改变key值新的value值;

url:发生改变的url地址;

storageArea:返回发生改变的Storage对象(是local storage还是session storage)。

  下面我们看个例子:

<!DOCTYPE HTML>
<html>
<head>
    <title>Storage</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 tableElement = document.getElementById('data');
        window.onstorage = function (e) {
            var row = '<tr>';
            row += '<td>' + e.key + '</td>';
            row += '<td>' + e.oleValue + '</td>';
            row += '<td>' + e.newValue + '</td>';
            row += '<td>' + e.url + '</td>';
            row += '<td>' + (e.storageArea == localStorage) + '</td></tr>';
            tableElement.innerHTML += row;
        }
    </script>
</body>
</html>

  我们在例1中增删改storage的数据,会在例2页面上显示出来。例2在chrome浏览器中运行正常,firefox没有反应,其他浏览器没有测试。

运行结果:

 

  3.使用session storage

  session storage在使用上和local storage一样,只是他的访问性上只限于当前页面,并且页面关闭后会消失,我们通过sessionStorage来访问它。

<!DOCTYPE HTML>
<html>
<head>
    <title>Example</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">There are <span id="count"></span>items</p>
    </div>
    <table id="data" border="1">
        <tr>
            <th>Item Count:</th>
            <td id="count">-</td>
        </tr>
    </table>
    <iframe src="storage.html" width="500" height="175"></iframe>
    <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);
                    break;
                case 'clear':
                    sessionStorage.clear();
                    break;
            }
            displayData();
        }

        function displayData() {
            var tableElement = document.getElementById('data');
            tableElement.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.getItem(key);
                tableElement.innerHTML += "<tr><th>" + key + ":</th><td>" + val + "</td></tr>";
            }
        }
    </script>
</body>
</html>

运行效果:

  你在例3中做任何修改,例2的页面不会发生任何改变。

    

  总结: 

  sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。

  localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。

  web storage和cookie的区别:Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。还有,web storage每个域(包括子域)有独立的存储空间,各个存储空间是完全独立的,因此不会造成数据混乱。

  但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生。

 

demo下载地址:Html5Guide.storage.zip

目录
相关文章
|
1月前
|
存储 移动开发 大数据
HTML5 Web IndexedDB 数据库详解
IndexedDB 是一种高效的浏览器存储方案,允许在本地存储大量结构化数据,支持索引和事务,适用于需要离线和大数据处理的应用。它由数据库、对象仓库等组成,通过键值对存储数据,确保数据一致性和完整性。本介绍展示了如何创建、读取、更新和删除数据,以及事务和错误处理的最佳实践。
|
1月前
|
存储 移动开发 数据库
HTML5 Web IndexedDB 数据库常用数据存储类型
IndexedDB 支持多种数据存储类型,满足复杂数据结构的存储需求。它包括基本数据类型(如 Number、String、Boolean、Date)、对象(简单和嵌套对象)、数组、Blob(用于二进制数据如图像和视频)、ArrayBuffer 和 Typed Arrays(处理二进制数据)、结构化克隆(支持 Map 和 Set 等复杂对象),以及 JSON 数据。尽管不直接支持非序列化数据(如函数和 DOM 节点),但可以通过转换实现存储。开发者应根据具体需求选择合适的数据类型,以优化性能和使用体验。
|
1月前
|
移动开发 JavaScript 前端开发
HTML5 Web Workers详解
HTML5 Web Workers 允许在后台线程中运行 JavaScript,实现复杂计算而不影响用户界面,提升应用性能。其主要特性包括并行处理、异步通信、独立作用域及多数据类型支持。通过创建和使用 Worker 文件,如 `worker.js`,可执行后台任务,并与主线程通过消息传递机制通信。适用于数据处理、图像处理、复杂计算及网络请求并行等场景。需要注意的是,Web Workers 在浏览器兼容性、安全性限制、调试及资源消耗方面需特别关注。合理利用 Web Workers 可显著增强 Web 应用的流畅度和响应速度。
|
1月前
|
SQL 存储 移动开发
HTML5 Web SQL 数据库详解
Web SQL 数据库是 HTML5 中的一种本地存储技术,允许在浏览器中使用 SQL 语言操作本地数据,支持离线访问和事务处理,适用于缓存数据和小型应用。然而,其存储容量有限且仅部分现代浏览器支持,标准已不再积极维护,未来可能被 IndexedDB 和 localStorage 等技术取代。使用时需谨慎考虑兼容性和发展前景。
|
1月前
|
存储 移动开发 缓存
HTML5 Web 存储详解
HTML5 Web 存储包括 `localStorage` 和 `sessionStorage`,前者提供持久存储且无过期时间,后者仅在会话期间有效。两者均支持键值对形式存储数据,容量约为 5-10 MB。`localStorage` 适用于用户偏好设置、登录状态保持及离线应用缓存;`sessionStorage` 则用于临时数据如表单输入。数据以字符串形式存储,可通过 `JSON` 方法处理对象。由于数据存储于本地,不适合存放敏感信息。示例代码展示了如何使用按钮将输入框内容保存至 `localStorage` 并进行清除操作。
|
1月前
|
移动开发 前端开发 JavaScript
HTML与现代Web开发的不同技术
【10月更文挑战第11天】HTML与现代Web开发的不同技术
24 0
|
存储 大数据 API
HTML5 Storage API
原文:HTML5 Storage API Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多。  在Web Storage出现之前,远程的Web服务器需要存储客户端和服务器间交互使用的所有相关数据。
990 0
|
2天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
14 6
|
19天前
|
移动开发 前端开发 JavaScript
[HTML、CSS]细节与使用经验
本文总结了前端开发中的一些重要细节和技巧,包括CSS选择器、定位、层级、全局属性、滚轮控制、轮播等。作者以纯文字形式记录,便于读者使用<kbd>Ctrl + F</kbd>快速查找相关内容。文章还提供了示例代码,帮助读者更好地理解和应用这些知识点。
40 1
[HTML、CSS]细节与使用经验
下一篇
无影云桌面