本地存储

Web Storage

cookie存储数据的不足

在HTML5出现之前,如果开发者需要在客户端存储少量的数据,只能通过cookie来实现,但是cookie存在几个不足点:

1、大小的限制

cookie的大小被限制在4KB。在Web的富应用环境中,不能接受文件或邮件那样的大数据。

2、带宽的限制

只要有涉及cookie的请求,cookie数据都会在服务器和浏览器间来回传送。这样无论访问哪个页面,cookie数据都会消耗网络的带宽。

3、安全风险

由于cookie会频繁地在网络中传送,而且数据在网络中是可见的,因此在不加密的情况下,是有安全风险的。

4、操作复杂

在客户端的浏览器中,使用JavaScript操作cookie数据是比较复杂的。但是服务器可以很方便地操作cookie数据

使用Web Storage存储的优势

Web Storage可以在客户端保存大量的数据,而且通过其提供的接口,访问数据也非常的方便。然而,Web Storage的诞生并不是为了替代cookie,相反,是为了弥补cookie在本地存储中表现的不足。

Web Storage本地存储的优势主要表现在以下几个方面。

1、存储容量

提供更大的存储容量。在Firefox、Chrome、Safari和Opera中,每个网域为5MB;在IE8及以上为10MB。

2、零带宽

Web Storage 因为是本地存储,不与服务器发生交互行为,所以不存在带宽的占用。

3、编程接口

Web Storage提供了一套丰富的编程接口,使得数据操作更加方便

4、独立的存储空间

每个域都有独立的存储空间,各个存储空间是完全独立的,因此不会造成数据的混乱。

由此可见,Web Storage并不能完全替代cookie,cookie能做的事情,Web Storage不一定能做到,如服务器可以访问cookie数据,但是不能访问Web Storage数据。所以Web Storage和cookie是相互补充的,会在各自不同领域发挥作用。

Web Storage简介

sessionStorage用于本地存储一个会话中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁,因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。

Storage API的属性和方法

保存数据:localStorage.setItem(key,value);
读取数据:localStorage.getItem(key);
删除单个数据:localStorage.removeItem(key);
删除所有数据:localStorage.clear();
得到某个索引的key:localStorage.key(index);

在使用sessionStorage和localStorage时,以上的属性和方法都可以使用。需要注意的是,key和value都必须为字符串,换言之,web Storage的API只能操作字符串。那么一些不是字符串的数据,我们可以通过JSON等方式将其转化成字符串格式后在操作。

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>HTML本地存储之web storage</title>  
    <style type="text/css">  
        #content{   
            border: 1px solid #3D19DD;   
            width:600px;   
            text-align:center;   
            padding: 10px 0;   
            margin: 0 auto;   
        }   
        #content input{   
            margin-top: 10px;   
        }   
</style>  
</head>  
<body>  
    <div id="content">  
         <label for="user_num">学号:</label>     
        <input type="text" id="user_num" name="user_num" />  
        <br/>  
        <label for="user_name">姓名:</label>     
        <input type="text" id="user_name" name="user_name" />     
        <br/>     
        <label for="grade">年级:</label>     
        <input type="text" id="grade" name="grade"/>     
        <br/>     
        <label for="sex">性别:</label>     
        <input type="text" id="sex" name="sex"/>     
        <br/>    
        <input type="button" onclick="save()" value="添加名单"/>     
        <hr/>     
        <label for="search_num">输入学号:</label>     
        <input type="text" id="search_num" name="search_num"/>     
        <input type="button" onclick="find()" value="查找学生信息"/>     
        <p id="find_result"><br/></p>  
        <hr/>  
         <input type="button" onclick="show()" value="显示所有">    
         <div id="list">     
         </div>    
    </div>     
    <br />             
</body>  
<script type="text/javascript">
  function save(){   
        var user_num = document.getElementById("user_num").value;   
        var user_nameElement = document.getElementById("user_name").value;   
        var gradeElement = document.getElementById("grade").value;     
        var sexElement = document.getElementById("sex").value;   
        var msg = {   
            user_name: user_nameElement,   
            grade: gradeElement,   
            sex: sexElement,   
        };    
        localStorage.setItem(user_num,JSON.stringify(msg));     
    }  
  function find(){     
        var user_num = document.getElementById("search_num").value;    
        var str = localStorage.getItem(user_num);    
        var msg = JSON.parse(str);    
        var find_result = document.getElementById("find_result");     
        find_result.innerHTML = "学号为:"+user_num+"的基本信息:姓名:"+msg.user_name + ",年级:" + msg.grade+",性别:"+msg.sex;     
    }    
  function show(){     
        var list = document.getElementById("list");     
        if(localStorage.length>0){     
            var result = "<table border='1' style='width:300px; margin:0 auto;'>";     
            result += "<tr><td>学号</td><td>姓名</td><td>年级</td><td>性别</td></tr>";     
            for(var i=0;i<localStorage.length;i++){     
                var user_num = localStorage.key(i);     
                var str = localStorage.getItem(user_num);     
                var msg = JSON.parse(str);     
                result += "<tr><td>"+user_num+"</td><td>"+msg.user_name+"</td><td>"+msg.grade+"</td><td>"+msg.sex+"</td></tr>";     
            }     
            result += "</table>";     
            list.innerHTML = result;     
          }else{     
                list.innerHTML = "当前还没有数据";     
          }     
    }     
</script>
</html>  
image.png

本地数据库

Web SQL数据库通过一套API来操纵客户端的数据库。Safari、Chrome、Firefox等主流浏览器都已经支持Web SQL Database。下面将一一将介绍怎样创建打开数据库,创建表,添加数据,更新数据,删除数据,删除表 。

先介绍三个核心方法
1、openDatabase:这个方法使用现有数据库或创建新数据库创建数据库对象。
2、transaction:这个方法允许我们根据情况控制事务提交或回滚。
3、executeSql:这个方法用于执行真实的SQL查询。

第一步:打开连接并创建数据库
var dataBase = openDatabase("student", "1.0", "学生表", 1024 * 1024, function () { });
if (!dataBase) {
alert("数据库创建失败!");
} else {
alert("数据库创建成功!");
}

解释一下openDatabase方法打开一个已经存在的数据库,如果数据库不存在,它还可以创建数据库。几个参数意义分别是:
1,数据库名称。
2,版本号 目前为1.0,不管他,写死就OK。
3,对数据库的描述。
4,设置数据的大小。
5,回调函数(可省略)。
初次调用时创建数据库,以后就是建立连接了。
创建的数据库就存在本地,创建的是一个sqllite数据库,可以用SQLiteSpy打开文件,可以看到里面的数据。SQLiteSpy是一个绿色软件,可以百度一下下载地址或SQLiteSpy官方下载:SQLiteSpy。

第二步:创建数据表

this.createTable=function() {
 dataBase.transaction( function(tx) {
 tx.executeSql(
 "create table if not exists stu (id REAL UNIQUE, name TEXT)",
 [],
 function(tx,result){ alert('创建stu表成功'); },
function(tx, error){ alert('创建stu表失败:' + error.message);
 });
 });
}
//ts.executeSql(sqlQuery,[value1,value2..],dataHandler,errorHandler)

executeSql函数有四个参数,其意义分别是:
1,表示查询的字符串,使用的SQL语言是SQLite 3.6.19。
2,插入到查询中问号所在处的字符串数据。
3,成功时执行的回调函数。返回两个参数:tx和执行的结果。
4,一个失败时执行的回调函数。返回两个参数:tx和失败的错误信息。

第三步:执行增删改查

1)添加数据:


this.insert = function () {
 dataBase.transaction(function (tx) {
 tx.executeSql(
 "insert into stu (id, name) values(?, ?)",
 [id, '徐明祥'],
function () { alert('添加数据成功'); },
function (tx, error) { alert('添加数据失败: ' + error.message);
 } );
 });

2)删除数据:


this.del = function (id) {
 dataBase.transaction(function (tx) {
 tx.executeSql(
 "delete from stu where id= ?",
 [id],
 function (tx, result) {
 },
 function (tx, error) {
 alert('删除失败: ' + error.message);
 });
 });
}

3)更新数据:


this
.update =
function (id, name) 
{
 dataBase.transaction(function (tx) {
 tx.executeSql(
 "update stu set name = ? where id= ?",
 [name, id],
 function (tx, result) {
 },
 function (tx, error) {
 alert('更新失败: ' + error.message);
 });
 });
}

4)查询数据:


this.query = function () {
 dataBase.transaction(function (tx) {
 tx.executeSql(
 "select * from stu", [],
 function (tx, result) { //执行成功的回调函数
//在这里对result 做你想要做的事情吧...........
 },
function (tx, error) {
 alert('查询失败: ' + error.message);
 } );
 });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容