目录

  1. WebStorage介绍
  2. 使用WebStorage中的API

1. 什么是Web Storage

在HTML5中,除了新增canvas元素之外,还新增的非常重要的功能是可以在客户端本地保存数据的WebStorage功能。Web应用的发展,使得客户端存储功能使用得越来越多,而实现客户端存储的方式则是多种多样。最简单而且兼容性最佳的方案就是cookies,单数作为真正的客户端存储,cookies是存在一些不足的:

  1. 大小:cookies的大小被限制在4KB

  2. 宽带:cookies是随HTTP事务一起发送的,因此会浪费一部分发送cookies时使用的宽带。

  3. 复杂:cookies操作起来是标胶麻烦:所有的信息要被拼到一个长字符串里面。

  4. 联系:对cookies来说,在相同的站点与多事务处理保持联系不是很容易。

在这种情况下,在HTML5中重新提供了在客户端本地保存数据的功能,它就是WebStroge功能。
顾名思义,WebStorage功能就是在Web上存储数据的功能,而这里的存储,是针对客户端本地而言的。它包含两种存储类型:sessionStoragelocalStroage二者都支持在同域下存储5MB数据,与cookies相比有着明显的优势。

1.1 sessionStorage

将数据保存在session对象中。所谓session,是指用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,即浏览这个网站所花费的事件。session对象可以用来保存在这段时间内索要保存的任何数据。

1.2 localStroage

将数据保存在客户端本地的硬件设备中,即使关闭了浏览器,改数据仍然存在,下次打开浏览器访问网站仍然可以继续使用。这两种不同的存储类型区别在于,sessionStorage为临时存储,而localStoage为永久保存。

2. WebStorage中的API

API 描述
length 获取当前WebStorage中的数目
key 返回WebStorage中的第N个存储条目
getItem(key) 返回指定key的存储内容,如果不存在则返回null。注意,返回的类型是字符串类型
setItem(key,value) 设置指定key的内容的值为value
removeItem(key) 根据指定的key,删除键值为key的内容
clear 清空webStorage的内容

2.1 数据的存储与获取

  1. 在localStorage中设置键值对可以用 setItem() 进行设置

localStorage.setItem("key","value")

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>数据的存储与获取</title>
    </head>
    <body>
        <script type="text/javascript">
            //设置存储数据的键值对  key和value 的名字都是自定义的   注意:value的值一定要是字符串或数字
            localStorage.setItem("这是key","这是value值")
        </script>
    </body>
</html>

F12或者右键检查打开谷歌浏览器的控制台,找到Application 点击Local Storage就可以看到上面设置

  1. 在localStorage获取数据可以用getItem()

var val = localStroage.getItem("key")

当然也可以直接使用localStorage的key方法,而不使用setItem()和getItem(),代码如下:

localStroage.key = "value"
var val = localStroage.key

demo:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>数据的存储与获取</title>
    </head>
    <body>
        <script type="text/javascript">
            //设置存储数据的键值对  key和value 的名字都是自定义的   注意:value的值一定要是字符串或数字
            localStorage.setItem("这是key","这是value值")
            //获取设置的key值
            var getValue = localStorage.getItem("这是key")
            console.log(getValue)  //输出   这是value值
        </script>
    </body>
</html>

2.2 数据的删除和清空

  1. removeItem() 用于Stroage列表删除指定数据

var val = localStroage. removeItem(key)

  1. clear()方法用于清空整个列表的所有数据

localStroage.clear()

2.3 JSON对象存储

虽然HTML5 Web Storage 规范允许将任意的类型的对象保存为键/值对的形式,实际情况却是一些浏览器将数据限定为文本字符串类型。不过,既然主流的浏览器原生支持JSON,就解决了这个问题。JSON格式是JavaScript Object Notation的缩写。
JSON是一种将对象和字符串可以相互表示的数据转换标准。JSON一直是通过HTTP将对象从浏览器传送到服务器一种常用格式。现在,可以通过序列化对象将JSON数据保存在Storage中,以实现复杂数据类型的持久化。

1. var str = JSON.stringify(data)

该参数接受一个参数data,该参数表示要转换成JSON格式文本数据的对象。这个方法的作用是将对象转换成JSON格式的文本数据,并将其返回。

2.var str = JSON.parse(str)

该参数接受一个参数str,此参数表示从localStorage中取得的数据,该方法的作用是将传入的数据转换成json对象,并且返回。

练习

练习1:历史记录存储
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>历史记录</title>
        <script src="../js/jquery-1.11.0.js"></script>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            .content{
                width: 520px;
                margin: 20px auto;
            }
            .header,.body,.footer{
                margin-top: 25px;
            }
            .content input{
                padding: 6px 12px;
                border: 1px solid #ddd;
                outline: none;
                box-shadow: 2px 2px 4px #ddd;
            }
            .content .btn{
                padding: 5px 12px;
                border: 1px solid #1E9FFF;
                background: #1E9FFF;
                color: #fff;
            }
            .body ul li{
                list-style: none;
                margin-top: 15px;
                padding: 6px 12px;
                min-width: 60px;
                border: 1px solid #ddd;
                float: left;
                margin-right: 10px;
                text-align: center;
                box-shadow: 2px 2px 4px #ddd;
            }
            .body ul li:hover{
                transition: 0.5s;
                background: #ddd;
            }
            .body ul li a{
                text-decoration: none;
                color: #666;
            }
            .footer a{
                color: #D43F3A;
                text-decoration: none;
            }
            .footer a:hover{
                text-decoration: underline;
            }
            .claer{
                clear: both;
            }
        </style>
    </head>
    <body>
        <div class="content">
            <div class="header">
                <input type="text" name="search" id="search" placeholder="请输入关键字"/>
                <button type="button" class="btn">搜索</button>
            </div>
            <div class="body">
                <h3>历史记录</h3>
                <ul>
                    <!--<li><a href="javascript:;">11111</a></li>
                    <li><a href="javascript:;">1111111111111111111111</a></li>-->
                </ul>
                <div class="claer"></div>
            </div>
            <div class="footer">
                <a href="javascript:;">清除记录</a>
            </div>
        </div>
        <script type="text/javascript">
            $(function(){
                //获取本地存储的数据
                var gTxt = JSON.parse(localStorage.getItem("searchData")) || [];
                if(gTxt.length>0){
                    var str = '';
                    for (var i=0;i<gTxt.length;i++) {
                        str+='<li><a href="javascript:;">'+gTxt[i]+'</a></li>'
                    }
                    $(".body ul").append(str);
                }
                //本地存储数据
                $(".btn").click(function(){
                    var textSer = $("#search").val();
                    for (var i=0;i<gTxt.length;i++) {
                        if(gTxt[i]==textSer){
                            return
                        }
                    }
                    gTxt.push(textSer);
                    //本地存储
                    localStorage.setItem("searchData",JSON.stringify(gTxt));
                    $("#search").val("");
                })
                //清除记录
                $(".footer a").click(function(){
                    localStorage.clear()
                    $(".body ul li").remove()
                })
            })
        </script>
    </body>
</html>
练习2:简单的todolist
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>todo</title>
        <script src="../js/jquery-1.11.0.js"></script>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
            }
            .container{
                width: 520px;
                margin: 20px auto;
                padding: 5px;
                border: 1px solid #ddd;
                box-shadow: 2px 2px 4px #ddd;
                line-height: 2.2;
            }
            textarea{
                width: 97%;
                height: 150px;
                resize: none;
                padding: 5px;
                outline: none;
            }
            .btn{
                padding: 6px 12px;
                background: #1E9FFF;
                border: 1px solid #1E9FFF;
                color: #fff;
            }
            ul li{
                list-style: none;
                border: 1px solid #ddd;
                padding: 0px 5px;
                box-shadow: 2px 2px 4px #ddd;
                margin-bottom: 15px;
            }
            ul li:hover{
                transition: 0.9s;
                background: #E7E7E7;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <textarea name="todo" rows="" cols=""></textarea>
            <button class="btn add">添加</button>
            

                代办:<strong class="wait">0</strong>
                完成:<strong class="done">0</strong>
            

            <hr />
            

<h4>代办</h4>

            <ul class="wait-list">
                <!–<li>11111</li>–>
            </ul>
            

<h4>完成</h4>

            <ul class="done-list">
                <!–<li>1111111</li>–>
            </ul>
        </div>
        

<script>
            $(function(){
                //读取代办的长度
                $(".wait").html(localStorage.length)
                //读取数据
                for (var i=0;i<localStorage.length;i++) {
                    var oLi = $("<li></li>"),
                        key = localStorage.key(i),
                        val = localStorage[key];
                    oLi.attr("data-hex",key);
                    oLi.html(val)
                    $(".wait-list").append(oLi)
                }
                //添加
                var oDate = null;
                $(".add").click(function(){
                    var oValue = $("textarea").val(),
                        times = new Date(),
                        oLi = $("<li>"+oValue+"</li>")
                    oDate = new Date().toLocaleString()
                    oLi.attr("data-hex",oDate)
                    localStorage.setItem(oDate,oValue)
                    $(".wait-list").append(oLi)
                    $("textarea").val("")
                    $(".wait").html(localStorage.length)
                })
                //完成
                $(document).on("click",".wait-list li",function(){
                    $(this).clone(true).appendTo(".done-list")
                    $(this).remove()
                    localStorage.removeItem($(this).data("hex"))
                    $(".wait").html(localStorage.length)
                    $(".done").html($(".done-list li").length)
                })
            })
        </script>
    </body>
</html>
练习3:todolist
<!DOCTYPE html>
<html>
    <head>
        <meta charset=”UTF-8″>
        <title></title>
        <script type=”text/javascript” src=”js/jquery-1.11.0.js” ></script>
        <style>
            *{
                margin: 0;
            }
            em{
                font-style: normal;
            }
            textarea{
                resize: none;
                outline: none;
                height: 200px;
                width:100%;
            }
            .container{
                width: 500px;
                margin: 20px auto;
                border-radius: 4px;
                border: 1px solid #ddd;
                padding: 10px;
            }
            .container .header{
                height: 250px;
                width: 100%;
            }
            .header-footer{
                height: 20px;
            }
            .header-footer .btn{
                float: right;
            }
            .list-item{
                border: 1px solid #ddd;
                padding: 10px;
                margin-top: 10px;
                position: relative;
                cursor: pointer;
            }
        </style>
    </head>
    <body>
        <div class=”container”>
            <div class=”header”>
                <textarea id=”text”></textarea>
                <div class=”header-footer”>
                    <button class=”btn send”>发送</button>
                </div>
            </div>
            <div class=”list”>
                <div class=”list-header”>
                    <span class=”noDone”>待帮<em>0</em></span>
                    <span class=”done”>已完成<em>0</em></span>
                </div>
                <div class=”list-content”>

                </div>
                <div class=”list-footer”>
                    <h4>已完成</h4>
                    <!–<div class=”list-item”>

                    </div>–>
                </div>

            </div>
        </div>
        <script>
            $(function(){
                var arrNoDone = JSON.parse(localStorage.getItem(“arrNoDone”))||[]
                var newArr = JSON.parse(localStorage.getItem(“newArr”))||[]
//                console.log(newArr)
                if(arrNoDone.length>0){
                    var noDone = arrNoDone.length
                    var str = “”
                    for (var i=0;i<arrNoDone.length;i++) {
                        str += ‘<div class=”list-item”>’+arrNoDone[i]+'</div>’
                    }
                    $(“.list-content”).append(str)
                    $(“.noDone em”).html(noDone)
                }else{
                    var noDone = 0
                }

                if(newArr.length>0){
                    var done = newArr.length
                    var str = “”
                    for (var i=0;i<newArr.length;i++) {
                        str += ‘<div class=”list-item”>’+newArr[i]+'</div>’
                    }
                    $(“.list-footer”).append(str)
                    $(“.done em”).html(done)
                }else{
                    var done = 0
                }

                $(“.send”).click(function(){
                    var oText = $(“#text”).val()
                    if(oText.length<0){
                        alert(‘不能为空’)
                    }else {
                        noDone++
                        arrNoDone.push(oText)
                        localStorage.setItem(“arrNoDone”,JSON.stringify(arrNoDone))
                        var str = ‘<div class=”list-item”>’+oText+'</div>’
                        $(“.list-content”).append(str)
                        $(“.noDone em”).html(noDone)
                        $(“#text”).val(“”)
                    }

                })

                $(document).on(“click”,”.list-item”,function(){
//                    alert(1)
                    noDone–
                    done++
                    var index = $(this).index()
                    var a = arrNoDone.splice(index,1)[0]
                    var dom = $(this).clone()
//                    console.log(a)
                    newArr.push(a)
                    localStorage.setItem(“arrNoDone”,JSON.stringify(arrNoDone))
                    localStorage.setItem(“newArr”,JSON.stringify(newArr))
                    $(this).remove()
                    $(“.noDone em”).html(noDone)
                    $(“.done em”).html(done)
                    $(“.list-footer”).append(dom)
                })

            })

        </script>
    </body>
</html>