HTML5 引入了两种机制,类似于 HTTP 的会话 cookies,用于在客户端存储结构化数据以及克服以下缺点。FAfHTML5中文学习网 - HTML5先行者学习网
每个 HTTP 请求中都包含 Cookies,从而导致传输相同的数据减缓我们的 Web 应用程序。FAfHTML5中文学习网 - HTML5先行者学习网
每个 HTTP 请求中都包含 Cookies,从而导致发送未加密的数据到互联网上。FAfHTML5中文学习网 - HTML5先行者学习网
Cookies 只能存储有限的 4KB 数据,不足以存储所需的数据。FAfHTML5中文学习网 - HTML5先行者学习网
这两种存储方式是 session storage 和 local storage,它们将用于处理不同的情况。FAfHTML5中文学习网 - HTML5先行者学习网
几乎所有最新版的浏览器都支持 HTML5 存储,包括 IE 浏览器。FAfHTML5中文学习网 - HTML5先行者学习网
会话存储FAfHTML5中文学习网 - HTML5先行者学习网
_会话存储_被设计用于用户执行单一事务的场景,但是同时可以在不同的窗口中执行多个事务。FAfHTML5中文学习网 - HTML5先行者学习网
示例FAfHTML5中文学习网 - HTML5先行者学习网
比如,如果用户在同一网站的两个不同的窗口中购买机票。如果该网站使用 cookie 跟踪用户购买的机票,当用户在窗口中点击页面时,从一个窗口到另一个时当前已经购买的机票会“泄漏”,这可能导致用户购买同一航班的两张机票而没有注意到。FAfHTML5中文学习网 - HTML5先行者学习网
HTML5 引入了 sessionStorage 属性,这个网站可以用来把数据添加到会话存储中,用户仍然可以在打开的持有该会话的窗口中访问同一站点的任意页面,当关闭窗口时,会话也会丢失。FAfHTML5中文学习网 - HTML5先行者学习网
下面的代码将会设置一个会话变量,然后访问该变量:FAfHTML5中文学习网 - HTML5先行者学习网
XML/HTML Code复制内容到剪贴板
    - <!DOCTYPE HTML>  
     - <html>  
     - <body>  
     -   
     -   <script type="text/javascript">  
     -     if( sessionStorage.hits ){   
     -        sessionStorage.hits = Number(sessionStorage.hits) +1;   
     -     }else{   
     -        sessionStorage.hits = 1;   
     -     }   
     -     document.write("Total Hits :" + sessionStorage.hits );   
     -   </script>  
     -   <p>Refresh the page to increase number of hits.</p>  
     -   <p>Close the window and open it again and check the result.</p>  
     -   
     - </body>  
     - </html>  
 
本地存储FAfHTML5中文学习网 - HTML5先行者学习网
_本地存储_被设计用于跨多个窗口进行存储,并持续处在当前会话上。尤其是,出于性能的原因 Web 应用程序可能希望在客户端存储百万字节的用户数据,比如用户撰写的整个文档或者是用户的邮箱。FAfHTML5中文学习网 - HTML5先行者学习网
Cookies 并不能很好的处理这种情况,因为每个请求都会传输。FAfHTML5中文学习网 - HTML5先行者学习网
示例FAfHTML5中文学习网 - HTML5先行者学习网
HTML5 引入了 localStorage 属性,可以用于访问页面的本地存储区域而没有时间限制,无论何时我们使用这个页面的时候本地存储都是可用的。FAfHTML5中文学习网 - HTML5先行者学习网
下面的代码设置了一个本地存储变量,每次访问这个页面时都可以访问该变量,甚至是下次打开窗口时:FAfHTML5中文学习网 - HTML5先行者学习网
XML/HTML Code复制内容到剪贴板
    - <!DOCTYPE HTML>  
     - <html>  
     - <body>  
     -   
     -   <script type="text/javascript">  
     -     if( localStorage.hits ){   
     -        localStorage.hits = Number(localStorage.hits) +1;   
     -     }else{   
     -        localStorage.hits = 1;   
     -     }   
     -     document.write("Total Hits :" + localStorage.hits );   
     -   </script>  
     -   <p>Refresh the page to increase number of hits.</p>  
     -   <p>Close the window and open it again and check the result.</p>  
     -   
     - </body>  
     - </html>  
 
便于学习上述概念 - 请进行在线练习。FAfHTML5中文学习网 - HTML5先行者学习网
删除 Web 存储FAfHTML5中文学习网 - HTML5先行者学习网
在本地机器上存储敏感数据可能是危险的,可能会留下安全隐患。FAfHTML5中文学习网 - HTML5先行者学习网
_会话存储数据_在会话终止之后将由浏览器立即删除。FAfHTML5中文学习网 - HTML5先行者学习网
要清除本地存储设置需要调用 localStorage.remove('key');这个 'key' 就是我们想要移除的值对应的键。如果想要清除所有设置,需要调用 localStorage.clear() 方法。FAfHTML5中文学习网 - HTML5先行者学习网
下面的代码会完全清除本地存储:FAfHTML5中文学习网 - HTML5先行者学习网
XML/HTML Code复制内容到剪贴板
    - <!DOCTYPE HTML>  
     - <html>  
     - <body>  
     -   
     -   <script type="text/javascript">  
     -     localStorage.clear();   
     -   
     -     // Reset number of hits.   
     -     if( localStorage.hits ){   
     -        localStorage.hits = Number(localStorage.hits) +1;   
     -     }else{   
     -        localStorage.hits = 1;   
     -     }   
     -     document.write("Total Hits :" + localStorage.hits );   
     -   </script>  
     -   <p>Refreshing the page would not to increase hit counter.</p>  
     -   <p>Close the window and open it again and check the result.</p>  
     -   
     - </body>  
     - </html>  
 
Web SQL 数据库FAfHTML5中文学习网 - HTML5先行者学习网
Web SQL 数据库 API 并不是 HTML5 规范的一部分,但是它是一个独立的规范,引入了一组使用 SQL 操作客户端数据库的 APIs。FAfHTML5中文学习网 - HTML5先行者学习网
核心方法FAfHTML5中文学习网 - HTML5先行者学习网
下面是规范中定义的三个核心方法。也会涵盖在本教程中:FAfHTML5中文学习网 - HTML5先行者学习网
openDatabase:这个方法使用现有的数据库或者新建的数据库创建一个数据库对象。FAfHTML5中文学习网 - HTML5先行者学习网
transaction:这个方法让我们能够控制一个事务,以及基于这种情况执行提交或者回滚。FAfHTML5中文学习网 - HTML5先行者学习网
executeSql:这个方法用于执行实际的 SQL 查询。FAfHTML5中文学习网 - HTML5先行者学习网
开启数据库FAfHTML5中文学习网 - HTML5先行者学习网
如果数据库已经存在,openDatabase 方法负责开启数据库,如果不存在,这个方法会创建它。FAfHTML5中文学习网 - HTML5先行者学习网
使用下面的代码可以创建并开启一个数据库:FAfHTML5中文学习网 - HTML5先行者学习网
JavaScript Code复制内容到剪贴板
    - var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  
 
上面的方法接受下列五个参数:FAfHTML5中文学习网 - HTML5先行者学习网
数据库名称FAfHTML5中文学习网 - HTML5先行者学习网
版本号FAfHTML5中文学习网 - HTML5先行者学习网
描述文本FAfHTML5中文学习网 - HTML5先行者学习网
数据库大小FAfHTML5中文学习网 - HTML5先行者学习网
创建回调FAfHTML5中文学习网 - HTML5先行者学习网
最后也是第五个参数,创建回调会在创建数据库后被调用。然而,即使没有这个特性(功能),运行时仍然会创建数据库以及正确的版本。FAfHTML5中文学习网 - HTML5先行者学习网
执行查询FAfHTML5中文学习网 - HTML5先行者学习网
执行查询需要使用 database.transaction() 函数。这个函数需要一个参数,它是一个负责实际执行查询的函数,如下所示:FAfHTML5中文学习网 - HTML5先行者学习网
JavaScript Code复制内容到剪贴板
    - var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);   
     - db.transaction(function (tx) {     
     -    tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');   
     - });  
 
上面的查询语句会在 'mydb' 数据库中创建一个叫做的 LOGS 的表。FAfHTML5中文学习网 - HTML5先行者学习网
插入操作FAfHTML5中文学习网 - HTML5先行者学习网
为了在表中创建条目,我们在上面的例子中加入简单的 SQL 查询,如下所示:FAfHTML5中文学习网 - HTML5先行者学习网
JavaScript Code复制内容到剪贴板
    - var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);   
     - db.transaction(function (tx) {   
     -    tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');   
     -    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');   
     -    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');   
     - });  
 
创建条目时还可以传递如下所示的动态值:FAfHTML5中文学习网 - HTML5先行者学习网
JavaScript Code复制内容到剪贴板
    - var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);   
     - db.transaction(function (tx) {     
     -   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');   
     -   tx.executeSql('INSERT INTO LOGS   
     -                         (id,log) VALUES (?, ?'), [e_id, e_log];   
     - });  
 
这里的 e_id 和 e_log 是外部变量,executeSql 会映射数组参数中的每个条目给 "?"。FAfHTML5中文学习网 - HTML5先行者学习网
读取操作FAfHTML5中文学习网 - HTML5先行者学习网
要读取已经存在的记录,我们可以使用回调来捕获结果,如下所示:FAfHTML5中文学习网 - HTML5先行者学习网
JavaScript Code复制内容到剪贴板
    - var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);   
     - db.transaction(function (tx) {   
     -    tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');   
     -    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');   
     -    tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');   
     - });   
     - db.transaction(function (tx) {   
     -    tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {   
     -    var len = results.rows.length, i;   
     -    msg = "<p>Found rows: " + len + "</p>";   
     -    document.querySelector('#status').innerHTML +=  msg;   
     -    for (i = 0; i < len; i++){   
     -       alert(results.rows.item(i).log );   
     -    }   
     -  }, null);   
     - });  
 
最终示例FAfHTML5中文学习网 - HTML5先行者学习网
最后,然我们把这个例子放到如下所示的完整 HTML5 文档中,然后尝试在 Safari 浏览器中运行它:FAfHTML5中文学习网 - HTML5先行者学习网
JavaScript Code复制内容到剪贴板
    - <!DOCTYPE HTML>   
     - <html>   
     - <head>   
     - <script type="text/javascript">   
     - var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);   
     - var msg;   
     - db.transaction(function (tx) {   
     -   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');   
     -   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")');   
     -   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")');   
     -   msg = '<p>Log message created and row inserted.</p>';   
     -   document.querySelector('#status').innerHTML =  msg;   
     - });   
     -   
     - db.transaction(function (tx) {   
     -   tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) {   
     -    var len = results.rows.length, i;   
     -    msg = "<p>Found rows: " + len + "</p>";   
     -    document.querySelector('#status').innerHTML +=  msg;   
     -    for (i = 0; i < len; i++){   
     -      msg = "<p><b>" + results.rows.item(i).log + "</b></p>";   
     -      document.querySelector('#status').innerHTML +=  msg;   
     -    }   
     -  }, null);   
     - });   
     - </script>   
     - </head>   
     - <body>   
     - <div id="status" name="status">Status Message</div>   
     - </body>   
     - </html>  
 
在浏览器中这会生成如下所示结果:FAfHTML5中文学习网 - HTML5先行者学习网
FAfHTML5中文学习网 - HTML5先行者学习网
Log message created and row inserted.</p><p>Found rows: 2</p><p>foobar</p><p>logmsgFAfHTML5中文学习网 - HTML5先行者学习网
FAfHTML5中文学习网 - HTML5先行者学习网