HTML5 学习统计(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)

HTML5问世未来,前端参预了一个主要的效益,便是当地存储,本地存储可分为4类:

Local
Storage
:总的存储量有所限制,并不能提供真正的检索API,数据的生命期比窗口或浏览器的生命期长,数据可被同源的各类窗口或者标签页共享,包容性很好,使用最多的囤积方式。

Session
Storage
:只要浏览器窗口不关门就会一贯留存,不应有把真的有价值的事物放在其中,数据会保存到存储它的窗口如故标签页关闭时,数据只在创设他们的窗口或者标签页可知

Indexed Database:在Indexed
Database中,objectstore代替了传统的表的概念,每个objectstore相当于一个key和value的成团,IndexedDB并不像传统的如SQL
Server那样需求额外安装。Indexed是存在于浏览器端的同时能被用户所访问控制。是保存不灵活用户数据的特等方案,也足以用于创建本地使用,NOSql。

Web SQL Database:实际上未包罗在HTML5正式中。和Indexed
Database都是在客户端存储多量结构化数据的化解方案。web sql
database完结了价值观的基于sql语句的数据库操作,而indexed
database已毕了nosql的存储格局,关周密据库。

Indexed
Database通过直接执行同步如故异步的函数调用来探寻树状的靶子存储引擎。索引数据库API避开了询问字符串,它利用的平底API援救将值直接存储在javascript对象中。存储在数据库中的值可以通过键或行使索引获取到,并且可以拔取同步或异步格局访问API。索引数据库也限制在同源范围内。

一、HTML4客户端存储

B/S架构的利用多量的音信存储在劳动器端,客户端通过请求响应的方法从服务器得到数量,那样集中储存也会给服务器带来相应的下压力,有些数据足以一向存储在客户端,传统的Web技术中会使用Cookie,但Cookie有部分瑕疵,为了讲明这一个毛病我们先看看当提交表单时会有那么些新闻会被浏览器收集后发送到服务器。

Cookies 客户端 独享 4K

Session 服务端 独享 少量

Application 服务端 共享 小量

1.1、提交表单发送到服务器的新闻

1)、带name的可用表单元素

2)、url

3)、客户端请求底部音讯

4)、cookie

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
//定义一个cookie对象
Cookie cookie=new     Cookie("color", "blue");
//设置过期时间为365小时,以秒为单位
cookie.setMaxAge(60*60*365);
//添加cookie
response.addCookie(cookie);
 %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport"
    content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<title>提交表单测试</title>
</head>
<body>
    <form action="target.do?id=1" method="post">
        <h2>提交表单测试</h2>
        <p>
            名称:<input type="text" name="txtName" id="txtName1" />
        </p>
        <p>
            价格:<input type="text" name="txtPrice" id="txtPrice1" value="888" readonly="readonly"/>
        </p>
        <p>
            数量:<input type="text" name="txtAmount" id="txtAmount1" value="999"  disabled="disabled"/>
        </p>
        <input type="hidden" id="key" value="123445">
        <input type="submit" value="提交" />
    </form>
</body>
</html>

运转结果:

图片 1

服务器在响应底部中宣称须要客户端浏览器指定设置cookie
color=blue的行事,且指定了晚点时间,会将cookie音讯记录在本地,查看结果如下:

图片 2

当提交新闻给服务器时cookie将采访后回来服务器,同时也会将url、带name可用的表单及请求底部新闻如user-agent等,结果如下:

图片 3

1.2、客户端本地存储概要

顾名思义客户端本地存储就是将新闻存储在客户端电脑上,cookie就是一种典型的传统客户端存储,长期以来本地存储能力平素是桌面应用分裂于Web应用的一个最首要优势,作为Web应用程序而言,新一代的HTML标准对数据的当地存储提议了更高的渴求。传统的Web数据存储方式直接来使用的是Cookie,但Cookie有以下缺陷:

a)、cookie会被增大在各类HTTP请求中,所以无形中增加了流量。

b)、由于在HTTP请求中的cookie是堂而皇之传递的,所以安全性成难题。

c)、Cookie的深浅限制在4 KB左右,容量达不到需求。

HTML5中的Web
Storage,称为Web本地存储,在Web客户端储存数据的听从,用键值对的格局保留数据,曾经属于HTML5的正儿八经,方今已经被单独出来形成独立的正规化体系。本地存储优势:

a)、统一的专业,包容性高(IE8、各大浏览器帮忙)

b)、数据存储量大

c)、无需安装插件

d)、减弱互联网流量

e)、尤其契合移动端

HTML5 提供了多样在客户端存储数据的新办法,即localStorage
、sessionStorage、globalStorage、Web Sql Database。
前面三个适用于储存较少的数据,而Web Sql
Database适用于储存大型的,复杂的数量,我习惯把前边的三个名叫小存储。 IE8、Firefox3.6、Chrome5、Safari4、Opera10,事实注脚各种浏览器在API方面的贯彻基本上一致,存在必然的包容性难点,但不影响健康使用。

在chrome浏览器中可以运用开发者工具查看到各类不一致的本土存储格局,如下图所示:

图片 4

Web SQL Database 和 Indexed Database
都是在客户端存储大量结构化数据的化解方案。Web SQL Database
完成了传统的按照 SQL 语句的数据库操作,而 Indexed Database 落成了 NoSQL
的积存方式。

Web Storage 那种用于存储 (key, value),一般两者都是字符串;

IndexDB 是增强型的 Web Storage,也是储存 (key, value);

Web SQL 则是 SQLite,一个完好无缺的关系型数据库,可以推行 SQL。

WebSQL是SQLite在浏览器中的完成,所以它是一种关系型数据库。由于W3C对其专业定义不够美丽,各家浏览器有个别完结,有浏览器包容难点;

IndexDB是一种key-value类型的非关周到据库(NoSQL)

二、localStorage

localStorage:将数据保存在客户端本地的硬件设施(日常指硬盘,但也得以是其余硬件配备)中,即便浏览器被关闭了,该数量如故存在,下次打开浏览器访问网站时仍可以屡次三番使用。

2.1、添加

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>localStorage 本地存储</title>
    </head>
    <body>
        <h2>localStorage 本地存储</h2>
        <button onclick="add_click()">添加</button>
        <script type="text/javascript">
            function    add_click()
            {
                //向本地存储中添加一个名为name,值为"手机"的key-value对象
                localStorage.setItem("name","手机");
                //办法2
                localStorage["price"]=999.5;
                //办法3
                localStorage.amount=1788;
            }
        </script>
    </body>
</html>

运行结果:

图片 5

2.2、取值

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>localStorage 本地存储</title>
    </head>
    <body>
        <h2>localStorage 本地存储</h2>
        <button onclick="add_click()">添加</button>
        <button onclick="get_click()">取值</button>
        <h3 id="msg"></h3>
        <a href="d02.html">d02.html</a>
        <script type="text/javascript">
            var msg=document.getElementById("msg");
            //添加
            function    add_click()
            {
                //向本地存储中添加一个名为name,值为"手机"的key-value对象
                localStorage.setItem("name","手机");
                //办法2
                localStorage["price"]=999.5;
                //办法3
                localStorage.amount=1788;
            }
            //取值
            function get_click()
            {
                msg.innerHTML+=localStorage.getItem("name")+"<br/>";
                msg.innerHTML+=localStorage["price"]+"<br/>";
                msg.innerHTML+=localStorage.amount+"<br/>";
            }
        </script>
    </body>
</html>

 运行结果:

图片 6

2.3、修改

            //修改
            function update_click()
            {
                //如果不存在就添加,如果存在就修改
                localStorage.setItem("name","iPhone 8 plus手机");
                //修改办法2
                localStorage["price"]=899.5;
                //修改办法3
                localStorage.amount=100;
            }

 运行结果:

图片 7

2.4、删除

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>localStorage 本地存储</title>
    </head>
    <body>
        <h2>localStorage 本地存储</h2>
        <button onclick="add_click()">添加</button>
        <button onclick="get_click()">取值</button>
        <button onclick="update_click()">修改</button>
        <button onclick="delete_click()">删除</button>
        <h3 id="msg"></h3>
        <a href="d02.html">d02.html</a>
        <script type="text/javascript">
            var msg=document.getElementById("msg");
            //添加
            function    add_click()
            {
                //向本地存储中添加一个名为name,值为"手机"的key-value对象
                localStorage.setItem("name","手机");
                //添加办法2
                localStorage["price"]=999.5;
                //添加办法3
                localStorage.amount=1788;
            }
            //取值
            function get_click()
            {
                msg.innerHTML+=localStorage.getItem("name")+"<br/>";
                msg.innerHTML+=localStorage["price"]+"<br/>";
                msg.innerHTML+=localStorage.amount+"<br/>";
            }
            //修改
            function update_click()
            {
                //如果不存在就添加,如果存在就修改
                localStorage.setItem("name","iPhone 8 plus手机");
                //修改办法2
                localStorage["price"]=899.5;
                //修改办法3
                localStorage.amount=100;
            }
            //删除
            function delete_click()
            {
               //根据键删除
               //localStorage.removeItem("price");
               //删除所有
               localStorage.clear();
            }
        </script>
    </body>
</html>

 运行结果:

图片 8

2.5、跨页面与跨域

当关闭浏览器,下次再打开时,值依旧存在。可以跨页面,无法跨域。大家在d01页面中添加了值,在d02页面中如故可以访问,在整整同域下都足以访问。

图片 9

2.6、存储地点与SQLite

localStorage与cookie差别,它存储在一个数据库文件中,默认地点在:C:\Users\Administrator\AppData\Local\Google\Chrome\User
Data\Default\databases\http_localhost_*

或者

C:\Users\Administrator\AppData\Local\Google\Chrome\User
Data\Profile 1\Local Storage

Administrator是现阶段报到用户名

图片 10

运用SQLite数据库管理工具,打开后来看的结果,那里以taobao存储客户端的localStorage为例:

图片 11

提醒:SQLite,是一款轻型的免费开源的数据库,是坚守ACID的关系型数据库管理种类,它包含在一个相对小的C库中。它是D.RichardHipp建立的国有领域项目。它的安插性目标是嵌入式的,而且近年来早已在许多嵌入式产品中利用了它,它占用资源丰硕的低,在嵌入式设备中,可能只需求几百K的内存就够了。它亦可扶助Windows/Linux/Unix等等主流的操作系统,同时可以跟很多程序语言相结合,比如
Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL那五款开源的社会风气有名数据库管理连串来讲,它的处理速度比她们都快。SQLite第四个Alpha版本诞生于2000年六月。
至2015年已经有15个年头,SQLite也迎来了一个本子 SQLite 3已经发表。

SQLiteSpy管理工具下载: http://pan.baidu.com/s/1i5JQtBf

2.7、用途、磨练与包容性

有着要求将少量(不当先4M)数据存储在客户端的须要都适用,如密码,用户偏好(profile)等

图片 12

登录成功后记录用户访问次数。

在IE8中测试通过

图片 13

Firefox测试通过

图片 14

三、sessionStorage

将数据临时保存在客户端session对象中。session对象就是会话对象,session中贮存的数目独立于各种客户,该多少会趁机浏览器的闭馆而没有。

sessionStorage的操作api与localStorage基本一样,在不手动清除的场地下localStorage永久保存,而sessionStorage只是暂时暂存。

3.1、sessionStorage使用

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>sessionStorage 本地存储</title>
    </head>
    <body>
        <h2>sessionStorage 本地存储</h2>
        <button onclick="add_click()">添加</button>
        <button onclick="get_click()">取值</button>
        <button onclick="update_click()">修改</button>
        <button onclick="delete_click()">删除</button>
        <h3 id="msg"></h3>
        <a href="d04.html">d04.html</a>
        <script type="text/javascript">
            var msg=document.getElementById("msg");
            //添加
            function    add_click()
            {
                //向本地存储中添加一个名为name,值为"手机"的key-value对象
                sessionStorage.setItem("name","手机");
                //添加办法2
                sessionStorage["price"]=999.5;
                //添加办法3
                sessionStorage.amount=1788;
            }
            //取值
            function get_click()
            {
                msg.innerHTML+=sessionStorage.getItem("name")+"<br/>";
                msg.innerHTML+=sessionStorage["price"]+"<br/>";
                msg.innerHTML+=sessionStorage.amount+"<br/>";
            }
            //修改
            function update_click()
            {
                //如果不存在就添加,如果存在就修改
                sessionStorage.setItem("name","iPhone 8 plus手机");
                //修改办法2
                sessionStorage["price"]=899.5;
                //修改办法3
                sessionStorage.amount=100;
            }
            //删除
            function delete_click()
            {
               //根据键删除
               //sessionStorage.removeItem("price");
               //删除所有
               sessionStorage.clear();
            }
        </script>
    </body>
</html>

运作结果:

图片 15

可以兑现在页面间传值,比如可以临时存储用户音信。

3.2、Web本地存储事件监听 

当程序修改localStorage与sessionStorage时将触发全局事件。

当setItem(),removeItem()或者clear()
方法被调用,并且数据真的暴发了改动时,就会触发storage事件,若是必要展开监听数据处理,通过以下方法:
window.addEventListener(event,handleEvent, capture)
event:设置成storage
handle伊夫nt:事件处理函数
capture:事件处理顺序,一般设置成false,表示采取冒泡情势处理

handle伊芙nt处总管件的函数会接收到一个Storage伊夫nt对象,该对象有以下属性:
key:被修改的键。
oldValue:修改前的值(倘诺是扩展新的键值,则该属性为null)
newValue:修改后的值(假使是删除键值,则该属性为null)
url/uri:触发当前储存事件的页面的url

只顾:storage改变的时候,触发这些事件会调用所有同域下其余窗口的storage事件,可是它本身触发storage即当前窗口是不会触发那些事件的(当然ie那一个特例除外,它涵盖自己本事也会触发storage事件)

 修改d02页面,监听值的转变。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>获得localStorage的值</title>
    </head>
    <body>
        <script type="text/javascript">
            console.log(localStorage.price);

            window.addEventListener("storage",function(obj){
                alert(obj.oldValue+","+obj.newValue+","+obj.url);
            },true);
        </script>
    </body>
</html>

运行结果如下:

图片 16

3.3、cookie、sessionStorage、localStorage比较

 图片 17

图片 18

四、Web SQL Database 

Web SQL Database 引入了一套使用 SQL 来决定客户端数据库(client-side
database)的 API,那几个 API 是异步的(asynchronous),规范中所使用的 SQL
语言为 SQLite。Web SQL Database API 实际上未包罗在 HTML 5
规范内部,它是一个单身的业内,它引入了一套使用 SQL 操作客户端数据库的
API,那几个 API 有同步的,也有异步的, 同步版本的 API 只在办事线程(Worker
Threads)上有用,由于并不是颇具的浏览器都协助工作线程,一般处境下,都会动用异步
API。包容情状如下:

图片 19

Web SQL
Database可以让开发人士使用SQL语句操作客户端浏览器中置放的SQLite数据库
,给开发人士提供了福利。对于简易的数码,使用sessionStorage和localStorage可以很好地形成存取,可是对于拍卖复杂的关系型数据,它就不可以了。那也是
HTML 5 的“Web SQLDatabase”API
接口的使用所在。我把它知道成一个Html5条件下可以用Js执行CRUD的Web数据库

多个中央措施
openDatabase:那几个方法应用现有数据库或创办新数据库创立数据库对象。
transaction:那些主意允许大家依照事态控制作业提交或回滚。
executeSql:这些方式用于执行实际的SQL查询。

图片 20

4.1、创立数据库

运用openDatabase创立或打开数据库,如若存在就开辟,即使不存在就创办,语法如下:

openDatabase(a,b,c,d,e);

a).数据库名称。
b).版本号 目前为1.0
c).对数据库的描述
d).设置数据的大小,以Byte为单位
e).回调函数(可粗略)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>
    <body>
        <h2>Web SQL Database</h2>
        <h2 id="msg"></h2>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
          //数据库
          var db;

          //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
          db=openDatabase("products",1.0,"产品数据库",1024*1024*3,function(){
              log("创建或打开数据库完成");
          });

          //显示消息
          function log(info){
              $("#msg")[0].innerHTML+=info+"<br/>";
          }
        </script>
    </body>
</html>

运转结果:

图片 21

4.2、创建表

推行所有的SQL语句都将应用到transaction、executeSql四个艺术,基本语法格式如下:

            数据库对象.transaction(function(tx) {
                tx.executeSql(
                    "要执行的sql", [参数],
                    function(tx, result) {
                        alert('成功时的回调方法');
                    },
                    function(tx, error) {
                        alert('失败时的回调方法' + error.message);
                    });
            });

页面脚本如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>

    <body>
        <h2>Web SQL Database</h2>
        <div>
            <button onclick="createTable()">创建表</button>
        </div>
        <h2 id="msg"></h2>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            //创建或打开名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
            var db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                log("创建数据库完成");
            });

            //创建表
            function createTable() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "create table if not exists goods(id integer primary key autoincrement,name text not null,price double)", [],
                        function(tx, result) {
                            log('创建表成功');
                        },
                        function(tx, error) {
                            log('创建表失败' + error.message);
                        });
                });
            }

            //显示消息
            function log(info) {
                $("#msg")[0].innerHTML += info + "<br/>";
            }
        </script>
    </body>

</html>

运作结果:

图片 22

当创立成功时,可以发现在出现了多少个表,其中名为sqlite_sequence为全自动增加用的体系。

4.3、添加数码

页面脚本如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>

    <body>
        <h2>Web SQL Database</h2>
        <div>
            <button onclick="createTable()">创建表</button>

            <fieldset>
                <legend>商品信息</legend>
                <p>
                    <label for="name">名称:</label>
                    <input type="text" id="name" value="" />
                </p>
                <p>
                    <label for="price">价格:</label>
                    <input type="text" id="price" value="" />
                </p>
                <p>
                    <button onclick="insert()">添加</button>
                </p>
            </fieldset>
        </div>
        <h2 id="msg"></h2>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
            var db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                log("创建或打开数据库完成");
            });

            //创建表
            function createTable() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "create table if not exists goods(id integer primary key autoincrement,name text not null,price double)", [],
                        function(tx, result) {
                            log('创建表成功');
                        },
                        function(tx, error) {
                            log('创建表失败' + error.message);
                        });
                });
            }

            //插入数据
            function insert() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "insert into goods(name,price) values(?,?)", 
                        [$("#name").val(),$("#price").val()],
                        function(tx, result) {
                            log('添加数据成功');
                        },
                        function(tx, error) {
                            log('添加数据失败' + error.message);
                        });
                });
            }



            //显示消息
            function log(info) {
                $("#msg")[0].innerHTML += info + "<br/>";
            }
        </script>
    </body>

</html>

运行结果:

图片 23

4.4、浮现数据

页面脚本如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>

    <body>
        <h2>Web SQL Database</h2>
        <div>
            <button onclick="createTable()">创建表</button>
            <table border="1" width="80%" id="tabGoods">
                <tr><th>编号</th><th>名称</th><th>价格</th><th>删除</th></tr>
            </table>
            <fieldset>
                <legend>商品信息</legend>
                <p>
                    <label for="name">名称:</label>
                    <input type="text" id="name" value="" />
                </p>
                <p>
                    <label for="price">价格:</label>
                    <input type="text" id="price" value="" />
                </p>
                <p>
                    <button onclick="insert()">添加</button>
                </p>
            </fieldset>
        </div>
        <h2 id="msg"></h2>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
            var db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                log("创建或打开数据库完成");
            });

            //展示,加载数据
            function select()
            {
                //将表格中tr索引大于0的元素删除
                $("#tabGoods tr:gt(0)").remove();
                db.transaction(function(tx) {
                    tx.executeSql(
                        "select id,name,price from goods", [],
                        function(tx, result) {

                            for (var i=0;i<result.rows.length;i++) {
                                var tr=$("<tr/>");

                                $("<td/>").text(result.rows.item(i)["id"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["name"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["price"]).appendTo(tr);
                                var del=$("<a href='#' onclick='del("+result.rows.item(i)["id"]+")' >删除</a>")
                                $("<td/>").append(del).appendTo(tr);

                                tr.appendTo("#tabGoods");
                            }

                        },
                        function(tx, error) {
                            log('创建表失败' + error.message);
                        });
                });
            }
            select();

            //创建表
            function createTable() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "create table if not exists goods(id integer primary key autoincrement,name text not null,price double)", [],
                        function(tx, result) {
                            log('创建表成功');
                        },
                        function(tx, error) {
                            log('创建表失败' + error.message);
                        });
                });
            }

            //插入数据
            function insert() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "insert into goods(name,price) values(?,?)", 
                        [$("#name").val(),$("#price").val()],
                        function(tx, result) {
                            log('添加数据成功');
                            select();
                        },
                        function(tx, error) {
                            log('添加数据失败' + error.message);
                        });
                });
            }



            //显示消息
            function log(info) {
                $("#msg")[0].innerHTML += info + "<br/>";
            }
        </script>
    </body>

</html>

运作结果如下:

图片 24

4.5、编辑数据

页面脚本如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>

    <body>
        <h2>Web SQL Database</h2>
        <div>
            <button onclick="createTable()">创建表</button>
            <table border="1" width="80%" id="tabGoods">
                <tr>
                    <th>编号</th>
                    <th>名称</th>
                    <th>价格</th>
                    <th>删除</th>
                </tr>
            </table>
            <fieldset>
                <legend>商品信息</legend>
                <p>
                    <label for="name">名称:</label>
                    <input type="text" id="name" value="" />
                </p>
                <p>
                    <label for="price">价格:</label>
                    <input type="text" id="price" value="" />
                </p>
                <p>
                    <input type="hidden" id="goodsId" />
                    <button onclick="insert()">添加</button>
                    <button onclick="update()">更新</button>
                </p>
            </fieldset>
        </div>
        <h2 id="msg"></h2>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
            var db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                log("创建或打开数据库完成");
            });

            //展示,加载数据
            function select() {
                //将表格中tr索引大于0的元素删除
                $("#tabGoods tr:gt(0)").remove();
                db.transaction(function(tx) {
                    tx.executeSql(
                        "select id,name,price from goods", [],
                        function(tx, result) {

                            for(var i = 0; i < result.rows.length; i++) {
                                var tr = $("<tr/>");

                                $("<td/>").text(result.rows.item(i)["id"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["name"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["price"]).appendTo(tr);
                                var del = $("<a href='#' onclick='del(" + result.rows.item(i)["id"] + ",this)' >删除 | </a>")
                                var edit = $("<a href='#' onclick='edit(" + result.rows.item(i)["id"] + ",this)' >修改</a>")
                                $("<td/>").append(del).append(edit).appendTo(tr);

                                tr.appendTo("#tabGoods");
                            }

                        },
                        function(tx, error) {
                            log('创建表失败' + error.message);
                        });
                });
            }
            select();

            //创建表
            function createTable() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "create table if not exists goods(id integer primary key autoincrement,name text not null,price double)", [],
                        function(tx, result) {
                            log('创建表成功');
                        },
                        function(tx, error) {
                            log('创建表失败' + error.message);
                        });
                });
            }

            //插入数据
            function insert() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "insert into goods(name,price) values(?,?)", [$("#name").val(), $("#price").val()],
                        function(tx, result) {
                            log('添加数据成功');
                            select();
                        },
                        function(tx, error) {
                            log('添加数据失败' + error.message);
                        });
                });
            }

            //删除 
            function del(id, link) {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "delete from goods where id=?", [id],
                        function(tx, result) {
                            log('删除成功');
                            //查找a标签最近的一个tr父元素,移除
                            $(link).closest("tr").remove();
                        },
                        function(tx, error) {
                            log('删除失败' + error.message);
                        });
                });
            }

            //编辑
            function edit(id) {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "select id,name,price from goods where id=?", [id],
                        function(tx, result) {
                            $("#name").val(result.rows.item(0)["name"]);
                            $("#price").val(result.rows.item(0)["price"]);
                            $("#goodsId").val(result.rows.item(0)["id"]);
                            log("修改后请保存");
                        },
                        function(tx, error) {
                            log('编辑失败' + error.message);
                        });
                });
            }

            //更新
            function update() {
                if($("#goodsId").val()) {
                    db.transaction(function(tx) {
                        tx.executeSql(
                            "update goods set name=?,price=?  where id=?", [$("#name").val(), $("#price").val(), $("#goodsId").val()],
                            function(tx, result) {
                                log('更新成功');
                                select();
                                $("#goodsId").val("");
                            },
                            function(tx, error) {
                                log('更新失败' + error.message);
                            });
                    });
                } else {
                    log("请选择要更新的记录 ");
                }
            }

            //显示消息
            function log(info) {
                $("#msg")[0].innerHTML += info + "<br/>";
            }
        </script>
    </body>

</html>

运作结果如下:

图片 25

图片 26

4.6、删除数据

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>

    <body>
        <h2>Web SQL Database</h2>
        <div>
            <button onclick="createTable()">创建表</button>
            <table border="1" width="80%" id="tabGoods">
                <tr><th>编号</th><th>名称</th><th>价格</th><th>删除</th></tr>
            </table>
            <fieldset>
                <legend>商品信息</legend>
                <p>
                    <label for="name">名称:</label>
                    <input type="text" id="name" value="" />
                </p>
                <p>
                    <label for="price">价格:</label>
                    <input type="text" id="price" value="" />
                </p>
                <p>
                    <button onclick="insert()">添加</button>
                </p>
            </fieldset>
        </div>
        <h2 id="msg"></h2>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
            var db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                log("创建或打开数据库完成");
            });

            //展示,加载数据
            function select()
            {
                //将表格中tr索引大于0的元素删除
                $("#tabGoods tr:gt(0)").remove();
                db.transaction(function(tx) {
                    tx.executeSql(
                        "select id,name,price from goods", [],
                        function(tx, result) {

                            for (var i=0;i<result.rows.length;i++) {
                                var tr=$("<tr/>");

                                $("<td/>").text(result.rows.item(i)["id"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["name"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["price"]).appendTo(tr);
                                var del=$("<a href='#' onclick='del("+result.rows.item(i)["id"]+",this)' >删除</a>")
                                $("<td/>").append(del).appendTo(tr);

                                tr.appendTo("#tabGoods");
                            }

                        },
                        function(tx, error) {
                            log('创建表失败' + error.message);
                        });
                });
            }
            select();

            //创建表
            function createTable() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "create table if not exists goods(id integer primary key autoincrement,name text not null,price double)", [],
                        function(tx, result) {
                            log('创建表成功');
                        },
                        function(tx, error) {
                            log('创建表失败' + error.message);
                        });
                });
            }

            //插入数据
            function insert() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "insert into goods(name,price) values(?,?)", 
                        [$("#name").val(),$("#price").val()],
                        function(tx, result) {
                            log('添加数据成功');
                            select();
                        },
                        function(tx, error) {
                            log('添加数据失败' + error.message);
                        });
                });
            }

            //删除 
            function del(id,link) {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "delete from goods where id=?", 
                        [id],
                        function(tx, result) {
                            log('删除成功');
                            //查找a标签最近的一个tr父元素,移除
                            $(link).closest("tr").remove();
                        },
                        function(tx, error) {
                            log('删除失败' + error.message);
                        });
                });
            }
            //显示消息
            function log(info) {
                $("#msg")[0].innerHTML += info + "<br/>";
            }
        </script>
    </body>

</html>

运作结果:

图片 27

4.7、删除表

删除表

            //创建表
            function dropTable() {
                db.transaction(function(tx) {
                    tx.executeSql(
                        "drop table IF EXISTS goods", [],
                        function(tx, result) {
                            log('删除表成功');
                        },
                        function(tx, error) {
                            log('删除表失败' + error.message);
                        });
                });
            }

运行结果:

图片 28

4.8、数据库地点

D:\Users\Administrator\AppData\Local\Google\Chrome\User
Data\Default\databases

图片 29

4.9、封装JavaScript

面前的演示中javascript方法都平昔揭穿在window下,有可能与其余js争论,可以开展简短封装。

不难对象封装示例:

        var ticker={
            n:0,
            add:function()
            {
                this.n++;
            },
            show:function()
            {
                alert(this.n);
            }
        }
        ticker.add();
        ticker.add();
        ticker.show();

 

运作结果:2 

首先次封装后的代码,在漫天window对象中只揭穿dbApp对象,代码如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>

    <body>
        <h2>Web SQL Database</h2>
        <div>
            <button id="btnCreateTable">创建表</button>
            <button id="btnDropTable">删除表</button>
            <table border="1" width="80%" id="tabGoods">
                <tr>
                    <th>编号</th>
                    <th>名称</th>
                    <th>价格</th>
                    <th>删除</th>
                </tr>
            </table>
            <fieldset>
                <legend>商品信息</legend>
                <p>
                    <label for="name">名称:</label>
                    <input type="text" id="name" value="" />
                </p>
                <p>
                    <label for="price">价格:</label>
                    <input type="text" id="price" value="" />
                </p>
                <p>
                    <input type="hidden" id="goodsId" />
                    <button id="btnInsert">添加</button>
                    <button id="btnUpdate">更新</button>
                </p>
            </fieldset>
        </div>
        <h2 id="msg"></h2>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">        
          //定义当前应用的对象
          var dbApp={
               //打开数据库
               openDb:function()
               {
                   //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
                this.db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                    this.log("创建或打开数据库完成");
                });
               },
               //初始化
               init:function()
               {
                   //打开或创建数据库
                   this.openDb();
                   //绑定事件
                   this.bindEvent();
                   //展示数据
                   this.select();
                   this.log("初始化完成");
               },
               //绑定事件
               bindEvent:function()
               {
                   //添加事件
                   $("#btnInsert").click(this.insert);
                   $("#btnUpdate").click(this.update);
                   $("#btnCreateTable").click(this.createTable);
                   $("#btnDropTable").click(this.dropTable);
               },
               //显示消息
            log:function(info) {
                $("#msg")[0].innerHTML += info + "<br/>";
            },
            //创建表
            createTable:function() {
                this.db.transaction(function(tx) {
                    tx.executeSql(
                        "create table IF not EXISTS goods(id integer primary key autoincrement,name text not null,price double)", [],
                        function(tx, result) {
                            this.log('创建表成功');
                        },
                        function(tx, error) {
                            this.log('创建表失败' + error.message);
                        });
                });
            },
            //删除表
            dropTable:function() {
                this.db.transaction(function(tx) {
                    tx.executeSql(
                        "drop table IF EXISTS goods", [],
                        function(tx, result) {
                            this.log('删除表成功');
                        },
                        function(tx, error) {
                            this.log('删除表失败' + error.message);
                        });
                });
            },
            //展示,加载数据
            select:function() {
                //将表格中tr索引大于0的元素删除
                $("#tabGoods tr:gt(0)").remove();
                this.db.transaction(function(tx) {
                    tx.executeSql(
                        "select id,name,price from goods", [],
                        function(tx, result) {

                            for(var i = 0; i < result.rows.length; i++) {
                                var tr = $("<tr/>");

                                $("<td/>").text(result.rows.item(i)["id"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["name"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["price"]).appendTo(tr);
                                var del = $("<a href='#' onclick='dbApp.del(" + result.rows.item(i)["id"] + ",this)' >删除 | </a>")
                                var edit = $("<a href='#' onclick='dbApp.edit(" + result.rows.item(i)["id"] + ",this)' >修改</a>")
                                $("<td/>").append(del).append(edit).appendTo(tr);

                                tr.appendTo("#tabGoods");
                            }

                        },
                        function(tx, error) {
                            this.log('创建表失败' + error.message);
                        });
                });
            },
            //插入数据
            insert:function() {
                //如果insert方法被绑定为事件,则this表示事件发生的对象
                dbApp.db.transaction(function(tx) {
                    tx.executeSql(
                        "insert into goods(name,price) values(?,?)", [$("#name").val(), $("#price").val()],
                        function(tx, result) {
                            dbApp.log('添加数据成功');
                            //刷新
                            dbApp.select();
                        },
                        function(tx, error) {
                            dbApp.log('添加数据失败' + error.message);
                        });
                });
            },
            //删除 
            del:function(id, link) {
                dbApp.db.transaction(function(tx) {
                    tx.executeSql(
                        "delete from goods where id=?", [id],
                        function(tx, result) {
                            dbApp.log('删除成功');
                            //查找a标签最近的一个tr父元素,移除
                            $(link).closest("tr").remove();
                        },
                        function(tx, error) {
                            dbApp.log('删除失败' + error.message);
                        });
                });
            },
            //编辑
            edit:function(id) {
                dbApp.db.transaction(function(tx) {
                    tx.executeSql(
                        "select id,name,price from goods where id=?", [id],
                        function(tx, result) {
                            $("#name").val(result.rows.item(0)["name"]);
                            $("#price").val(result.rows.item(0)["price"]);
                            $("#goodsId").val(result.rows.item(0)["id"]);
                            dbApp.log("修改后请保存");
                        },
                        function(tx, error) {
                            dbApp.log('编辑失败' + error.message);
                        });
                });
            },
            //更新
            update:function() {
                if($("#goodsId").val()) {
                    dbApp.db.transaction(function(tx) {
                        tx.executeSql(
                            "update goods set name=?,price=?  where id=?", [$("#name").val(), $("#price").val(), $("#goodsId").val()],
                            function(tx, result) {
                                dbApp.log('更新成功');
                                dbApp.select();
                                $("#goodsId").val("");
                            },
                            function(tx, error) {
                                dbApp.log('更新失败' + error.message);
                            });
                    });
                } else {
                    dbApp.log("请选择要更新的记录 ");
                }
            }
          };

        dbApp.init();            
        </script>
    </body>

</html>

运作结果:

图片 30

从上面的代码可以发现操作数据库,执行sql的办法存在大气的冗余,可以优化,优化后的代码如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    </head>

    <body>
        <h2>Web SQL Database</h2>
        <div>
            <button id="btnCreateTable">创建表</button>
            <button id="btnDropTable">删除表</button>
            <table border="1" width="80%" id="tabGoods">
                <tr>
                    <th>编号</th>
                    <th>名称</th>
                    <th>价格</th>
                    <th>删除</th>
                </tr>
            </table>
            <fieldset>
                <legend>商品信息</legend>
                <p>
                    <label for="name">名称:</label>
                    <input type="text" id="name" value="" />
                </p>
                <p>
                    <label for="price">价格:</label>
                    <input type="text" id="price" value="" />
                </p>
                <p>
                    <input type="hidden" id="goodsId" />
                    <button id="btnInsert">添加</button>
                    <button id="btnUpdate">更新</button>
                </p>
            </fieldset>
        </div>
        <h2 id="msg"></h2>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">        
          //定义当前应用的对象
          var dbApp={
               //打开数据库
               openDb:function()
               {
                   //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
                this.db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                    this.log("创建或打开数据库完成");
                });
               },
               //初始化
               init:function()
               {
                   //打开或创建数据库
                   this.openDb();
                   //绑定事件
                   this.bindEvent();
                   //展示数据
                   this.select();
                   this.log("初始化完成");
               },
               //绑定事件
               bindEvent:function()
               {
                   //添加事件
                   $("#btnInsert").click(this.insert);
                   $("#btnUpdate").click(this.update);
                   $("#btnCreateTable").click(this.createTable);
                   $("#btnDropTable").click(this.dropTable);
               },
               //显示消息
            log:function(info) {
                $("#msg")[0].innerHTML += info + "<br/>";
            },
            //执行sql的通用方法 result.rowsAffected 影响行数
            //callback执行成功时的回调方法
            exeSql:function(sql,title,param,callback) {
                title=title||"操作";
                this.db.transaction(function(tx) {
                    tx.executeSql(
                        sql, param||[],
                        function(tx, result) {
                            dbApp.log(title+'成功');
                            if(callback){  //如果有参数
                                callback(result);
                            }
                        },
                        function(tx, error) {
                            dbApp.log(title+'失败' + error.message);
                        });
                });
            },
            //创建表
            createTable:function() {
                dbApp.exeSql("create table IF not EXISTS goods(id integer primary key autoincrement,name text not null,price double)","创建表");
            },
            //删除表
            dropTable:function() {
                dbApp.exeSql("drop table IF EXISTS goods","删除表");
            },
            //展示,加载数据
            select:function() {
                dbApp.exeSql("select id,name,price from goods","查询",[],function(result) {
                           //将表格中tr索引大于0的元素删除
                            $("#tabGoods tr:gt(0)").remove();
                            for(var i = 0; i < result.rows.length; i++) {
                                var tr = $("<tr/>");

                                $("<td/>").text(result.rows.item(i)["id"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["name"]).appendTo(tr);
                                $("<td/>").text(result.rows.item(i)["price"]).appendTo(tr);
                                var del = $("<a href='#' onclick='dbApp.del(" + result.rows.item(i)["id"] + ",this)' >删除 | </a>")
                                var edit = $("<a href='#' onclick='dbApp.edit(" + result.rows.item(i)["id"] + ",this)' >修改</a>")
                                $("<td/>").append(del).append(edit).appendTo(tr);
                                tr.appendTo("#tabGoods");
                            }
                            });
            },
            //插入数据
            insert:function() {
                //如果insert方法被绑定为事件,则this表示事件发生的对象
                dbApp.exeSql("insert into goods(name,price) values(?,?)","添加",[$("#name").val(), $("#price").val()],function(){
                    dbApp.select();
                });
            },
            //删除 
            del:function(id, link) {
                dbApp.exeSql("delete from goods where id=?","删除",[id],function(result){
                    //查找a标签最近的一个tr父元素,移除
                    $(link).closest("tr").remove();
                });
            },
            //编辑
            edit:function(id) {
                dbApp.exeSql("select id,name,price from goods where id=?","编辑",[id],function(result) {
                            $("#name").val(result.rows.item(0)["name"]);
                            $("#price").val(result.rows.item(0)["price"]);
                            $("#goodsId").val(result.rows.item(0)["id"]);
                            dbApp.log("修改后请保存");
                    });
            },
            //更新
            update:function() {
                if($("#goodsId").val()) {
                    dbApp.exeSql("update goods set name=?,price=?  where id=?","更新",[$("#name").val(), $("#price").val(), $("#goodsId").val()],function(result) {
                                dbApp.select();
                                $("#goodsId").val("");
                    });
                } else {
                    dbApp.log("请选择要更新的记录 ");
                }
            }
          };

        dbApp.init();            
        </script>
    </body>

</html>

运转结果:

图片 31

4.10、美化页面

在原页面的功底上平添css样式,添加样式后的页面脚本如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>Web SQL Database</title>
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <style type="text/css">
            * {
                margin: 0;
                padding: 0;
                font-family: "microsoft yahei";
            }
            #container{
                padding: 10px;
                font-size: 14px;
            }
            #container a{
                color: #fff;
                text-decoration: none;
                margin-right: 5px;
            }
            #container a:hover{
                color:orangered;
            }
            button,a{
                border: 0;
                height: 22px;
                line-height: 22px;
                border-radius: 3px;
                padding:0 10px;
                background: dodgerblue;
                color: white;
            }
            button:hover{
                background: orangered;
            }
            #container h2{
                height: 60px;
            }
            html #tabGoods{
                width:100%;
                margin: 15px 0;
                border: 2px solid #0062CC;
            }
            #tabGoods,#tabGoods td,#tabGoods th
            {
                border: 1px solid #0062CC;
                border-collapse: collapse;
            }
            #tabGoods td,#tabGoods th{
                padding: 5px 0 5px 5px;
            }
            #fieldsetForm{
                width: 400px;
                padding: 10px;
                border-radius: 10px;
                border: 2px solid #0062CC;
            }
            #fieldsetForm p{
                padding: 10px;
            }
            #msg{
                font-size: 16px;
                font-weight: normal;
                height: 100px;
                overflow: auto;
                margin-top: 10px;
            }
        </style>
    </head>

    <body>
        <div id="container">
            <h2>Web SQL Database</h2>
            <button id="btnCreateTable">创建表</button>
            <button id="btnDropTable">删除表</button>
            <table id="tabGoods">
                <tr>
                    <th>编号</th>
                    <th>名称</th>
                    <th>价格</th>
                    <th>删除</th>
                </tr>
            </table>
            <fieldset id="fieldsetForm">
                <legend>商品信息</legend>
                <p>
                    <label for="name">名称:</label>
                    <input type="text" id="name" value="" />
                </p>
                <p>
                    <label for="price">价格:</label>
                    <input type="text" id="price" value="" />
                </p>
                <p>
                    <input type="hidden" id="goodsId" />
                    <button id="btnInsert">添加</button>
                    <button id="btnUpdate">更新</button>
                </p>
            </fieldset>
            <h2 id="msg"></h2>
        </div>
        <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script type="text/javascript">
            //定义当前应用的对象
            var dbApp = {
                //打开数据库
                openDb: function() {
                    //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
                    this.db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                        this.log("创建或打开数据库完成");
                    });
                },
                //初始化
                init: function() {
                    //打开或创建数据库
                    this.openDb();
                    //绑定事件
                    this.bindEvent();
                    //展示数据
                    this.select();
                    this.log("初始化完成");
                },
                //绑定事件
                bindEvent: function() {
                    //添加事件
                    $("#btnInsert").click(this.insert);
                    $("#btnUpdate").click(this.update);
                    $("#btnCreateTable").click(this.createTable);
                    $("#btnDropTable").click(this.dropTable);
                },
                //显示消息
                log: function(info) {
                    $("#msg")[0].innerHTML += info + "<br/>";
                },
                //执行sql的通用方法 result.rowsAffected 影响行数
                //callback执行成功时的回调方法
                exeSql: function(sql, title, param, callback) {
                    title = title || "操作";
                    this.db.transaction(function(tx) {
                        tx.executeSql(
                            sql, param || [],
                            function(tx, result) {
                                dbApp.log(title + '成功');
                                if(callback) { //如果有参数
                                    callback(result);
                                }
                            },
                            function(tx, error) {
                                dbApp.log(title + '失败' + error.message);
                            });
                    });
                },
                //创建表
                createTable: function() {
                    dbApp.exeSql("create table IF not EXISTS goods(id integer primary key autoincrement,name text not null,price double)", "创建表");
                },
                //删除表
                dropTable: function() {
                    dbApp.exeSql("drop table IF EXISTS goods", "删除表");
                },
                //展示,加载数据
                select: function() {
                    dbApp.exeSql("select id,name,price from goods", "查询", [], function(result) {
                        //将表格中tr索引大于0的元素删除
                        $("#tabGoods tr:gt(0)").remove();
                        for(var i = 0; i < result.rows.length; i++) {
                            var tr = $("<tr/>");

                            $("<td/>").text(result.rows.item(i)["id"]).appendTo(tr);
                            $("<td/>").text(result.rows.item(i)["name"]).appendTo(tr);
                            $("<td/>").text(result.rows.item(i)["price"]).appendTo(tr);
                            var del = $("<a href='#' onclick='dbApp.del(" + result.rows.item(i)["id"] + ",this)' >删除</a> ")
                            var edit = $("<a href='#' onclick='dbApp.edit(" + result.rows.item(i)["id"] + ",this)' >修改</a>")
                            $("<td/>").append(del).append(edit).appendTo(tr);
                            tr.appendTo("#tabGoods");
                        }
                    });
                },
                //插入数据
                insert: function() {
                    //如果insert方法被绑定为事件,则this表示事件发生的对象
                    dbApp.exeSql("insert into goods(name,price) values(?,?)", "添加", [$("#name").val(), $("#price").val()], function() {
                        dbApp.select();
                    });
                },
                //删除 
                del: function(id, link) {
                    dbApp.exeSql("delete from goods where id=?", "删除", [id], function(result) {
                        //查找a标签最近的一个tr父元素,移除
                        $(link).closest("tr").remove();
                    });
                },
                //编辑
                edit: function(id) {
                    dbApp.exeSql("select id,name,price from goods where id=?", "编辑", [id], function(result) {
                        $("#name").val(result.rows.item(0)["name"]);
                        $("#price").val(result.rows.item(0)["price"]);
                        $("#goodsId").val(result.rows.item(0)["id"]);
                        dbApp.log("修改后请保存");
                    });
                },
                //更新
                update: function() {
                    if($("#goodsId").val()) {
                        dbApp.exeSql("update goods set name=?,price=?  where id=?", "更新", [$("#name").val(), $("#price").val(), $("#goodsId").val()], function(result) {
                            dbApp.select();
                            $("#goodsId").val("");
                        });
                    } else {
                        dbApp.log("请选择要更新的记录 ");
                    }
                }
            };

            dbApp.init();
        </script>
    </body>

</html>

运行结果:

图片 32

五、IndexedDB

Web Sql
API的严重性完结者是Chrome、Safari、Opera、Android、IOS、BB。IE和FF都不帮衬Web
Sql API。

IndexedDB由于境遇W3C的赏识。浏览器厂商的贯彻动静要好一些。但出于当下标准表明书还只是处在候选提议阶段。各大浏览器厂商如今的兑现还有一些差异化。

IndexedDB是在浏览器中保留结构化数据的一种数据库,为了替换WebSQL(标准已甩掉,但被周边支持)而产出。IndexedDB使用NoSQL的花样来操作数据库,保存和读取是JavaScript对象,同时还帮助查询及查找。

API: https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API

示范代码:

图片 33图片 34

if('indexedDB' in window){
    //检测是否支持indexed database
}else{
    mui.alert('您的手机占不支持');
}
//数据库信息
var DB = {
    name:'admin_users',
    version:1
}
var db;
function openDB(name,version){
    //第一个参数是数据库名称,如果存在则打开,如果不存在就创建
    //第二个参数是数据库版本,用于更新数据库结构
    var request = window.indexedDB.open(name,version);

        request.onerror = function(e){
            mui.alert('打开数据库失败');
        }

        request.onsuccess = function(e){
            db = request.result;
            ReadAll();
        }
        //操作数据库(创建删除修改)
        //首次打开数据库或改变数据库版本的时候触发
        request.onupgradeneeded = function(e){
            //使用createObjectStore()方法创建一个对象存储
            //此方法接受两个参数:存储的名称和参数对象
            //keypath是用户数据的唯一标识 或者使用索引
            var objectStore = e.target.result.createObjectStore("users",{keyPath:'name'});
        }
}

function Add(name,account,password){
    //transaction()方法是用来指定我们想要进行事务处理的对象存储,接受3个参数
    //第一个(必选)要处理的对象存储的列表数组
    //第二个(可选)指定操作方式 只读/读写
    //第三个(可选)版本变化
    //add()方法用于添加数据
    var request = db.transaction(["users"],"readwrite").objectStore("users").add({
        name:name,
        account:account,
        password:password
    });

    request.onsuccess = function(e){
        mui.toast('成功');
        var list = document.querySelector('#list');
        var dom = '<li class="mui-table-view-cell mui-collapse">';
                    dom+= '<a class="mui-navigate-right" href="#">'+name+'</a>';
                    dom+= '<div class="mui-collapse-content"><p>账号:'+account+'</p>';
                    dom+= '<p>密码:'+password+'</p></div></li>';
            list.innerHTML += dom;
    }

    request.onerror = function(e){
        mui.toast('失败');
    }
}

function Read(name){
    var objectStore = db.transaction(["users"]).objectStore("users");
    //get()方法用于获取数据
    var request = objectStore.get(name);

        request.onerror = function(event){
            mui.toast('读取失败');
        }

        request.onsuccess = function(event){
            if(request.result){
                console.log(request.result);
            }
        }
}

function ReadAll(){
    var objectStore = db.transaction("users").objectStore("users");
    //openCursor()方法用于获取所有数据
    var request = objectStore.openCursor();

        request.onsuccess = function(event){
            //db.close();
            var res = event.target.result;
            var list = document.querySelector('#list');
            if(res){
                var dom = '<li class="mui-table-view-cell mui-collapse">';
                    dom+= '<a class="mui-navigate-right" href="#">'+res.value.name+'</a>';
                    dom+= '<div class="mui-collapse-content"><p>账号:'+res.value.account+'</p>';
                    dom+= '<p>密码:'+res.value.password+'</p></div></li>';

                list.innerHTML += dom;
                //console.log(res.value);
                res.continue();
            }
        }

        request.onerror = function(e){
            mui.toast('读取失败')
        }
}

function Remove(name){
    //delete()方法用于删除数据
    var request = db.transaction("users","readwrite").objectStore('users').delete(name);
        request.onsuccess = function(event){
            mui.toast('删除成功');
        }
        request.onerror = function(){
            mui.toast('删除失败')
        }
}
openDB(DB.name,DB.version);


var submits = document.querySelector('#submit');
function display(dis){
    var bg = document.querySelectorAll('.alert-bg')[0];
    var alert = document.querySelectorAll('.alert')[0];
    alert.style.display = dis;
    bg.style.display = dis;
}
submits.onclick = function(){
    var name      = document.querySelector('#name').value;
    var account  = document.querySelector('#account').value;
    var password = document.querySelector('#password').value;
    if(!name || !account || !password){
        return mui.toast('请输入完整信息');
    }
    display('none');
    Add(name,account,password)
}

View Code

5.1、数据库开头化

IndexedDB保存的是目的,而不是使用表保存数据。打开数据库使用indexDB.open方法,那措施有四个参数,首个是数据库名称,第四个是数码版本号。

IndexedDB的操作完全是异步举行的,每便IndexedDB操作,都急需注册onerror或onsuccess事件处理程序。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>IndexedDB</title>
    </head>

    <body>
        <h2>IndexedDB(NOSQL)</h2>
        <input value="创建数据库与表" type="button" onclick="create()" />
        <h2 id="msg"></h2>
        <script>
            //数据库
            var db;

            //创建数据库与表
            function create() {
                //创建一个名称为gomall且版本为2的数据库,返回一个请求
                var request = indexedDB.open("gomall", 2);
                //绑定回调事件,成功时
                request.onsuccess = function(e) {
                    db = e.target.result;
                    log('创建数据库成功');
                };
                //失败时
                request.onerror = function(e) {
                    log("错误:" + e.target.errorCode || e.target.error);
                };
                //增加数据库版本号时,会触发onupgradeneeded事件(会在onsuccess之前被调用)
                request.onupgradeneeded = function(e) {
                    //创建对象存储空间(ObjectStore),类似表,goods是表名,id是主键,存储的是JSON
                    e.target.result.createObjectStore("goods",{"keyPath":"id"});
                    log("初始化数据库成功!");
                };
            }

            //显示消息
            var msg = document.getElementById("msg");

            function log(m) {
                msg.innerHTML += m + "<br/>";
            }

            //用于判断浏览器是否支持indexedDB,0,null,'',undefind false
            if(window.indexedDB) {

            } else {
                alert('请升级浏览器,如chrome');
            }
        </script>
    </body>

</html>

那边要小心的是,数据库版本只会有新型一个,不会同时设有三个本子的同名数据库。

运作结果:

图片 35

5.2、对象存储空间(ObjectStore)

目的存储空间(ObjectStore)可以想像成关周到据库的表,在早先化DB触发onupgradeneeded时,创立ObjectStore。使用createObjectStore方法,第四个参数是目的名,第三个参数是目的属性,一般是安装keyPath(作为键使用)。

因为对新数据的操作都亟需在transaction中开展,而transaction又要求指定object
store,所以我们只可以在成立数据库的时候初始化object
store以供前边使用,那多亏onupgradeneeded的一个重大作用

有了数据库后我们本来期待创设一个表用来存储数据,但indexedDB中向来不表的概念,而是objectStore,一个数据库中可以分包多个objectStore,objectStore是一个心灵手巧的数据结构,可以存放四种类型数据。也就是说一个objectStore相当于一张表,里面储存的每条数据和一个键相关联。

咱俩得以拔取每条记下中的某个指定字段作为键值(keyPath),也可以行使自动生成的多如牛毛数字作为键值(keyGenerator),也得以不点名。选用键的档次不一致,objectStore可以储存的数据结构也有反差

不采取—>任意值,然而没添加一条数据的时候需求指定键参数

keyPath—>Javascript对象,对象必须有一属性作为键值

keyGenerator—>任意值(db.createObjectStore(‘students’,{autoIncrement:
true});)

都使用—>Javascript对象,若是目标中有keyPath指定的质量则不生成新的键值,即使没有自动生成递增键值,填充keyPath指定属性

     req.onupgradeneeded = function (evt) {
          console.debug("initDb.onupgradeneeded");
          var db = evt.currentTarget.result;
          //ObjectStore必须在onupgradeneeded里创建,其他地方将会创建失败
          var usersStore = db.createObjectStore("users", { keyPath : "id" });
     };

成效如下:

图片 36

图片 37.png)

5.3、事务

负有读取或改动数据的操作,都要由此工作来成功。创设工作使用transaction方法,第三个参数是内需拜访的ObjectStore,第一个参数是造访形式(readwrite可读可写、readonly只读,默许是只读)。

5.4、添加数据

示例:

图片 38图片 39

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>IndexedDB</title>
    </head>

    <body>
        <h2>IndexedDB(NOSQL)</h2>
        <input value="创建数据库与表" type="button" onclick="create()" />
        <input value="新增数据" type="button" onclick="add()" />
        <h2 id="msg"></h2>
        <script>
            //数据库
            var db;

            //创建数据库与表
            function create() {
                //创建一个名称为gomall且版本为2的数据库,返回一个请求
                var request = indexedDB.open("gomall", 2);
                //绑定回调事件,成功时
                request.onsuccess = function(e) {
                    db = e.target.result;
                    log('创建数据库成功');
                };
                //失败时
                request.onerror = function(e) {
                    log("错误:" + e.target.errorCode || e.target.error);
                };
                //增加数据库版本号时,会触发onupgradeneeded事件(会在onsuccess之前被调用)
                request.onupgradeneeded = function(e) {
                    //创建对象存储空间(ObjectStore),类似表,goods是表名,id是主键,存储的是JSON
                    e.target.result.createObjectStore("goods",{"keyPath":"id"});
                    log("初始化数据库成功!");
                };
            }

            //新增数据
            function add(){
                //创建事务对象
                var tx=db.transaction("goods","readwrite");
                //从数据库中获得存储对象,表
                var goods=tx.objectStore("goods");
                //javascript中的对象数组
                var items=[{"id":1,"name":"iPhone 11","price":19999.5},{"id":2,"name":"华为荣耀V9","price":1997.3}];
                for(var i=0;i<items.length;i++){
                    goods.add(items[i]);
                }
                log("添加数据成功!");
            }

            //显示消息
            var msg = document.getElementById("msg");

            function log(m) {
                msg.innerHTML += m + "<br/>";
            }

            //用于判断浏览器是否支持indexedDB,0,null,'',undefind false
            if(window.indexedDB) {

            } else {
                alert('请升级浏览器,如chrome');
            }
        </script>
    </body>

</html>

View Code 

 结果:

图片 40

5.5、获取单个对象数据

示例:

图片 41图片 42

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>IndexedDB</title>
    </head>

    <body>
        <h2>IndexedDB(NOSQL)</h2>
        <input value="创建数据库与表" type="button" onclick="create()" />
        <input value="新增数据" type="button" onclick="add()" />
        <input value="获得单个对象" type="button" onclick="getSingle()" />
        <h2 id="msg"></h2>
        <script>
            //数据库
            var db;

            //创建数据库与表
            function create() {
                //创建一个名称为gomall且版本为2的数据库,返回一个请求
                var request = indexedDB.open("gomall", 2);
                //绑定回调事件,成功时
                request.onsuccess = function(e) {
                    db = e.target.result;
                    log('创建数据库成功');
                };
                //失败时
                request.onerror = function(e) {
                    log("错误:" + e.target.errorCode || e.target.error);
                };
                //增加数据库版本号时,会触发onupgradeneeded事件(会在onsuccess之前被调用)
                request.onupgradeneeded = function(e) {
                    //创建对象存储空间(ObjectStore),类似表,goods是表名,id是主键,存储的是JSON
                    e.target.result.createObjectStore("goods", {
                        "keyPath": "id"
                    });
                    log("初始化数据库成功!");
                };
            }

            //新增数据
            function add() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //javascript中的对象数组
                var items = [{
                    "id": 1,
                    "name": "iPhone 11",
                    "price": 19999.5
                }, {
                    "id": 2,
                    "name": "华为荣耀V9",
                    "price": 1997.3
                }];
                for(var i = 0; i < items.length; i++) {
                    goods.add(items[i]);
                }
                log("添加数据成功!");
            }

            //获得单个对象
            function getSingle() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //请求key为1的对象
                var request=goods.get(1);
                request.onsuccess=function(e){
                    var obj=e.target.result;
                    //JSON.stringify将obj对象转换成字符
                    log(JSON.stringify(obj));
                    log(obj.id+","+obj.name+","+obj.price);
                };
            }

            //显示消息
            var msg = document.getElementById("msg");

            function log(m) {
                msg.innerHTML += m + "<br/>";
            }

            //用于判断浏览器是否支持indexedDB,0,null,'',undefind false
            if(window.indexedDB) {

            } else {
                alert('请升级浏览器,如chrome');
            }
        </script>
    </body>

</html>

View Code

结果:

图片 43

5.6、修改数据

示例:

图片 44图片 45

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>IndexedDB</title>
    </head>

    <body>
        <h2>IndexedDB(NOSQL)</h2>
        <input value="创建数据库与表" type="button" onclick="create()" />
        <input value="新增数据" type="button" onclick="add()" />
        <input value="获得单个对象" type="button" onclick="getSingle()" />
        <input value="更新对象" type="button" onclick="edit()" />
        <h2 id="msg"></h2>
        <script>
            //数据库
            var db;

            //创建数据库与表
            function create() {
                //创建一个名称为gomall且版本为2的数据库,返回一个请求
                var request = indexedDB.open("gomall", 2);
                //绑定回调事件,成功时
                request.onsuccess = function(e) {
                    db = e.target.result;
                    log('创建数据库成功');
                };
                //失败时
                request.onerror = function(e) {
                    log("错误:" + e.target.errorCode || e.target.error);
                };
                //增加数据库版本号时,会触发onupgradeneeded事件(会在onsuccess之前被调用)
                request.onupgradeneeded = function(e) {
                    //创建对象存储空间(ObjectStore),类似表,goods是表名,id是主键,存储的是JSON
                    e.target.result.createObjectStore("goods", {
                        "keyPath": "id"
                    });
                    log("初始化数据库成功!");
                };
            }

            //新增数据
            function add() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //javascript中的对象数组
                var items = [{
                    "id": 1,
                    "name": "iPhone 11",
                    "price": 19999.5
                }, {
                    "id": 2,
                    "name": "华为荣耀V9",
                    "price": 1997.3
                }];
                for(var i = 0; i < items.length; i++) {
                    goods.add(items[i]);
                }
                log("添加数据成功!");
            }

            //获得单个对象
            function getSingle() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //请求key为1的对象
                var request = goods.get(2);
                request.onsuccess = function(e) {
                    var obj = e.target.result;
                    //JSON.stringify将obj对象转换成字符
                    log(JSON.stringify(obj));
                    log(obj.id + "," + obj.name + "," + obj.price);
                };
            }

            //更新对象
            function edit() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //javascript中的对象数组
                var item = {
                    "id": 2,
                    "name": "华为荣耀P15",
                    "price":1357.9,
                    "os":"android"
                };
                //执行更新
                var request=goods.put(item);
                request.onsuccess=function(e){
                    log(e.target.result);
                };
            }

            //显示消息
            var msg = document.getElementById("msg");

            function log(m) {
                msg.innerHTML += m + "<br/>";
            }

            //用于判断浏览器是否支持indexedDB,0,null,'',undefind false
            if(window.indexedDB) {

            } else {
                alert('请升级浏览器,如chrome');
            }
        </script>
    </body>

</html>

View Code

结果:

图片 46

5.7、删除数据

示例:

图片 47图片 48

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>IndexedDB</title>
    </head>

    <body>
        <h2>IndexedDB(NOSQL)</h2>
        <input value="创建数据库与表" type="button" onclick="create()" />
        <input value="新增数据" type="button" onclick="add()" />
        <input value="获得单个对象" type="button" onclick="getSingle()" />
        <input value="更新对象" type="button" onclick="edit()" />
        <input value="删除对象" type="button" onclick="del()" />
        <h2 id="msg"></h2>
        <script>
            //数据库
            var db;

            //创建数据库与表
            function create() {
                //创建一个名称为gomall且版本为2的数据库,返回一个请求
                var request = indexedDB.open("gomall", 2);
                //绑定回调事件,成功时
                request.onsuccess = function(e) {
                    db = e.target.result;
                    log('创建数据库成功');
                };
                //失败时
                request.onerror = function(e) {
                    log("错误:" + e.target.errorCode || e.target.error);
                };
                //增加数据库版本号时,会触发onupgradeneeded事件(会在onsuccess之前被调用)
                request.onupgradeneeded = function(e) {
                    //创建对象存储空间(ObjectStore),类似表,goods是表名,id是主键,存储的是JSON
                    e.target.result.createObjectStore("goods", {
                        "keyPath": "id"
                    });
                    log("初始化数据库成功!");
                };
            }

            //新增数据
            function add() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //javascript中的对象数组
                var items = [{
                    "id": 1,
                    "name": "iPhone 11",
                    "price": 19999.5
                }, {
                    "id": 2,
                    "name": "华为荣耀V9",
                    "price": 1997.3
                }];
                for(var i = 0; i < items.length; i++) {
                    goods.add(items[i]);
                }
                log("添加数据成功!");
            }

            //获得单个对象
            function getSingle() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //请求key为1的对象
                var request = goods.get(2);
                request.onsuccess = function(e) {
                    var obj = e.target.result;
                    //JSON.stringify将obj对象转换成字符
                    log(JSON.stringify(obj));
                    log(obj.id + "," + obj.name + "," + obj.price);
                };
            }

            //更新对象
            function edit() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //javascript中的对象数组
                var item = {
                    "id": 2,
                    "name": "华为荣耀P15",
                    "price":1357.9,
                    "os":"android"
                };
                //执行更新
                var request=goods.put(item);
                request.onsuccess=function(e){
                    log(e.target.result);
                };
            }

            //删除对象
            function del() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //执行删除操作
                var request=goods.delete(2);
                //成功时的回调
                request.onsuccess=function(e){
                    log(e.target.result);
                };
            }

            //显示消息
            var msg = document.getElementById("msg");

            function log(m) {
                msg.innerHTML += m + "<br/>";
            }

            //用于判断浏览器是否支持indexedDB,0,null,'',undefind false
            if(window.indexedDB) {

            } else {
                alert('请升级浏览器,如chrome');
            }
        </script>
    </body>

</html>

View Code

 

结果:

图片 49

5.8、清空数据

function clearData(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var req = store.clear();
     req.onsuccess = function (evt) {
          console.debug("clearData success");
     };
     req.onerror = function (evt) {
          console.error("clearData error:", evt.target.errorCode || evt.target.error);
     };
}

5.9、游标查询

选拔工作可以直接通过键摸索单个对象,而急需摸索八个对象时候就需求使用游标。游标是指向结果集的指针,不提前收集结果。游标指针会先指向结果中的第一项,在接受查找下一项命令时,才会指向下一项。

function openCursor(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var req = store.openCursor();
     req.onsuccess = function (evt) {
          var cursor = evt.target.result;
          if(cursor){ //必要检查
               var value = cursor.value;
               console.log(value);
               if(value.name == '杨幂'){
                    value.age = 16;
                    cursor.update(value); //修改数据(必须是读写模式)
               }
               if(value.name == '柳岩'){
                    cursor.delete();  //删除当前项
               }
               cursor.continue(); //移动到下一项
          }
     };
     req.onerror = function (evt) {
          console.error("openCursor error:", evt.target.errorCode || evt.target.error);
     };
}

此间有几点要专注:

  1. 一经急需修改或删除数据,就须要开辟成读写方式。

  2. cursor的非空校验是要求的。

  3. 修改或删除的操作也是有onsuccess和onerror的,只是在演示中从未写出来。

  4. 调用continue才会移动到下一项

别的可以安装游标的键范围和游标的方向,即打开openCursor方法时方可传那七个参数(openCursor(键范围,方向)),第三个参数是object类型,第四个参数是字符串类型。

示例:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>IndexedDB</title>
    </head>

    <body>
        <h2>IndexedDB(NOSQL)</h2>
        <input value="创建数据库与表" type="button" onclick="create()" />
        <input value="新增数据" type="button" onclick="add()" />
        <input value="获得单个对象" type="button" onclick="getSingle()" />
        <input value="更新对象" type="button" onclick="edit()" />
        <input value="删除对象" type="button" onclick="del()" />
        <input value="获得多个对象(游标)" type="button" onclick="getAll()" />
        <h2 id="msg"></h2>
        <script>
            //数据库
            var db;

            //创建数据库与表
            function create() {
                //创建一个名称为gomall且版本为2的数据库,返回一个请求
                var request = indexedDB.open("gomall", 2);
                //绑定回调事件,成功时
                request.onsuccess = function(e) {
                    db = e.target.result;
                    log('创建数据库成功');
                };
                //失败时
                request.onerror = function(e) {
                    log("错误:" + e.target.errorCode || e.target.error);
                };
                //增加数据库版本号时,会触发onupgradeneeded事件(会在onsuccess之前被调用)
                request.onupgradeneeded = function(e) {
                    //创建对象存储空间(ObjectStore),类似表,goods是表名,id是主键,存储的是JSON
                    e.target.result.createObjectStore("goods", {
                        "keyPath": "id"
                    });
                    log("初始化数据库成功!");
                };
            }

            //新增数据
            function add() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //javascript中的对象数组
                var items = [{
                    "id": 2,
                    "name": "iPhone 13",
                    "price": 19999.5
                }, {
                    "id": 3,
                    "name": "华为荣耀V10",
                    "price": 1997.3
                }];
                for(var i = 0; i < items.length; i++) {
                    goods.add(items[i]);
                }
                log("添加数据成功!");
            }

            //获得单个对象
            function getSingle() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //请求key为1的对象
                var request = goods.get(2);
                request.onsuccess = function(e) {
                    var obj = e.target.result;
                    //JSON.stringify将obj对象转换成字符
                    log(JSON.stringify(obj));
                    log(obj.id + "," + obj.name + "," + obj.price);
                };
            }

            //更新对象
            function edit() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //javascript中的对象数组
                var item = {
                    "id": 2,
                    "name": "华为荣耀P15",
                    "price": 1357.9,
                    "os": "android"
                };
                //执行更新
                var request = goods.put(item);
                request.onsuccess = function(e) {
                    log(e.target.result);
                };
            }

            //删除对象
            function del() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //执行删除操作
                var request = goods.delete(2);
                //成功时的回调
                request.onsuccess = function(e) {
                    log(e.target.result);
                };
            }

            //获得多个对象(游标)
            function getAll() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //打开游标
                var request = goods.openCursor();
                //成功时的回调
                request.onsuccess = function(e) {
                    //获得游标
                    var cursor = e.target.result;
                    if(cursor) { //如果不为空
                        var obj = cursor.value;
                        log(JSON.stringify(obj));
                        //下移
                        cursor.continue();
                    }
                };
            }

            //显示消息
            var msg = document.getElementById("msg");

            function log(m) {
                msg.innerHTML += m + "<br/>";
            }

            //用于判断浏览器是否支持indexedDB,0,null,'',undefind false
            if(window.indexedDB) {

            } else {
                alert('请升级浏览器,如chrome');
            }
        </script>
    </body>

</html>

 

结果:

图片 50

 

5.10、游标键范围

键范围由IDBKeyRange的实例表示。

图片 51

IDBKeyRange.only('001');  //只想要键为001的结果
IDBKeyRange.lowerBound('002'); //从键为002开始,到最后
IDBKeyRange.lowerBound('002', true); //从键为002开始,但忽略002,到最后
IDBKeyRange.upperBound('002'); //从头开始,到键为002为止
IDBKeyRange.upperBound('002', true); //从头开始,到键为002为止,但忽略002
IDBKeyRange.bound('001', '005'); //从001开始,到为005为止
IDBKeyRange.bound('001', '005', true, true); //从001开始,到为005为止,但忽略001、005

图片 52

5.11、游标方向

next : 从第一项到最终一项(默许)

prev : 从最后一项到第一项

索引

当必要利用任何品质(非主键)获取数据时,就要优先创制索引,然后采纳索引获取数据。

创建索引(在数据库初阶化onupgradeneeded事件时)

先是个参数是索引名字,第四个参数是索引的属性的名字,首个是一个options对象。一般是指定unique,设置索引是还是不是唯一。

usersStore.createIndex("name", "name", { unique : false });

目录获取数据

图片 53

function indexGetData(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var index = store.index("name");
     var req = index.get("杨幂")
     req.onsuccess = function (evt) {
          console.debug("indexGet success" , evt.target.result);
     };
     req.onerror = function (evt) {
          console.error("indexGet error:", evt.target.errorCode || evt.target.error);
     };
}

function indexOpenCursor(){
     var tx = db.transaction("users", READ_WRITE);
     var store = tx.objectStore("users");
     var index = store.index("name");
     var req = index.openCursor();
     req.onsuccess = function (evt) {
          var cursor = evt.target.result;
          if(cursor){ //必要检查
               var value = cursor.value;
               console.log(value);
               cursor.continue(); //移动到下一项
          }
     };
     req.onerror = function (evt) {
          console.error("openCursor error:", evt.target.errorCode || evt.target.error);
     };
}

图片 54

PS:索引用法跟一般取值和游标取值一样

对象存储所有索引

图片 55

function indexNames(){
     var tx = db.transaction("users", READ_WRITE);
    var store = tx.objectStore("users");
     var indexNames = store.indexNames;
     var index, i = 0, len = indexNames.length;
     while(i < len){
          index = store.index(indexNames[i++]);
          console.log(index);
     }
}

图片 56

5.12、删除数据库

var request = indexedDB.deleteDatabase(name);
var request = indexedDB.deleteDatabase(name, options);

var DBDeleteRequest = window.indexedDB.deleteDatabase("toDoList");

DBDeleteRequest.onerror = function(event) {
  console.log("Error deleting database.");
};

DBDeleteRequest.onsuccess = function(event) {
  console.log("Database deleted successfully");

  console.log(event.result); // should be undefined
};

5.13、删除存储对象

dbInstance.deleteObjectStore(name);

var dbName = "sampleDB";
var dbVersion = 2;
var request = indexedDB.open(dbName, dbVersion);

request.onupgradeneeded = function(e) {
  var db = request.result;
  if (e.oldVersion < 1) {
    db.createObjectStore("store1");
  }

  if (e.oldVersion < 2) {
    db.deleteObjectStore("store1");
    db.createObjectStore("store2");
  }

  // etc. for version < 3, 4...
};

六、移动端打包与运作

6.1、在堂哥大端直接访问Web站点

将手机与统计机三番五次到同一个网段,比如可以采纳wifi

查看本机ip地址,有时须求将本地连接禁用,查看ip地址的指令是ipconfig

在手机端使用浏览器查看结果如下:

图片 57

6.2、打包成app安装运行

那边运用HBuilder打包成apk的安装包,安装打包结果如下:

图片 58

图片 59

6.3、套用移动端UI框架MUI

官网: http://www.dcloud.io/

文档: http://dev.dcloud.net.cn/mui/ui/

源码: https://github.com/dcloudio/mui/

6.3.1、Hello MUI

示例:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title>Hello MUI</title>
        <link href="css/mui.min.css" rel="stylesheet" />
    </head>

    <body>
        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">Hello MUI</h1>
        </header>

        <div class="mui-content">
            <div class="mui-content-padded">
                <button type="button" class="mui-btn">默认</button>
                <button type="button" class="mui-btn mui-btn-primary" id="btnHello">Hello</button>
                <button type="button" class="mui-btn mui-btn-success">绿色</button>
                <button type="button" class="mui-btn mui-btn-warning">黄色</button>
                <button type="button" class="mui-btn mui-btn-danger">红色</button>
                <button type="button" class="mui-btn mui-btn-royal">紫色</button>
            </div>
        </div>

        <script src="js/mui.min.js"></script>
        <script type="text/javascript" charset="utf-8">
            mui.init({
            });

            document.getElementById("btnHello").addEventListener("tap",function(){
                mui.alert("Hello MUI!","提示","确认",function(){
                    mui.toast("关闭完成");
                });
            },false);
        </script>
    </body>

</html>

效果:

图片 60

6.3.2、事件与转场

代码:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title>Hello MUI</title>
        <link href="css/mui.min.css" rel="stylesheet" />
    </head>

    <body>
        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">Hello MUI</h1>
        </header>

        <div class="mui-content">
            <div class="mui-content-padded">
                <button type="button" class="mui-btn">默认</button>
                <button type="button" class="mui-btn mui-btn-primary" id="btnHello">Hello</button>
                <button type="button" class="mui-btn mui-btn-success" id="btnWin">窗口</button>
                <button type="button" class="mui-btn mui-btn-warning">黄色</button>
                <button type="button" class="mui-btn mui-btn-danger">红色</button>
                <button type="button" class="mui-btn mui-btn-royal">紫色</button>
            </div>
        </div>

        <script src="js/mui.min.js"></script>
        <script type="text/javascript" charset="utf-8">
            mui.init({
                //侧滑关闭
                swipeBack: true //Boolean(默认false)启用右滑关闭功能
            });

            document.getElementById("btnHello").addEventListener("tap", function() {
                mui.alert("Hello MUI!", "提示", "确认", function() {
                    mui.toast("关闭完成");
                });
            }, false);

            //mui加载完成
            mui.ready(function() {
                mui(".mui-content").on("tap", "#btnWin", function() {

                    mui.openWindow({
                        url: "sub1.html?id=1",
                        id: "sub1.html",
                        extras: {
                            id: "1"
                        },
                        createNew: false, //是否重复创建同样id的webview,默认为false:不重复创建,直接显示
                        show: {
                            autoShow: true //页面loaded事件发生后自动显示,默认为true
                        },
                        waiting: {
                            autoShow: true, //自动显示等待框,默认为true
                            title: '正在加载...' //等待对话框上显示的提示内容
                        }
                    });

                });
            });
        </script>
    </body>

</html>

效果:

图片 61

6.3.3、列表与选项卡

示例:

图片 62图片 63

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <title>Hello List</title>
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black">
        <!--标准mui.css-->
        <link rel="stylesheet" href="css/mui.min.css">
        <style>
            .title {
                margin: 20px 15px 10px;
                color: #6d6d72;
                font-size: 15px;
            }

            .oa-contact-cell.mui-table .mui-table-cell {
                padding: 11px 0;
                vertical-align: middle;
            }

            .oa-contact-cell {
                position: relative;
                margin: -11px 0;
            }

            .oa-contact-avatar {
                width: 75px;
            }

            .oa-contact-avatar img {
                border-radius: 50%;
            }

            .oa-contact-content {
                width: 100%;
            }

            .oa-contact-name {
                margin-right: 20px;
            }

            .oa-contact-name,
            oa-contact-position {
                float: left;
            }
        </style>
    </head>

    <body>
        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">用户列表</h1>
        </header>
        <nav class="mui-bar mui-bar-tab">
            <a class="mui-tab-item mui-active" href="#tabbar">

                首页
            </a>
            <a class="mui-tab-item" href="#tabbar-with-chat">
                9
                添加
            </a>
            <a class="mui-tab-item" href="#tabbar-with-contact">

                我的
            </a>
            <a class="mui-tab-item" href="#tabbar-with-map">

                设置
            </a>
        </nav>
        <div class="mui-content">
            <div id="slider" class="mui-slider">
                <div class="mui-slider-group mui-slider-loop">
                    <!-- 额外增加的一个节点(循环轮播:第一个节点是最后一张轮播) -->
                    <div class="mui-slider-item mui-slider-item-duplicate">
                        <a href="#">
                            <img src="images/yuantiao.jpg">
                        </a>
                    </div>
                    <!-- 第一张 -->
                    <div class="mui-slider-item">
                        <a href="#">
                            <img src="images/shuijiao.jpg">
                        </a>
                    </div>
                    <!-- 第二张 -->
                    <div class="mui-slider-item">
                        <a href="#">
                            <img src="images/muwu.jpg">
                        </a>
                    </div>
                    <!-- 第三张 -->
                    <div class="mui-slider-item">
                        <a href="#">
                            <img src="images/cbd.jpg">
                        </a>
                    </div>
                    <!-- 第四张 -->
                    <div class="mui-slider-item">
                        <a href="#">
                            <img src="images/yuantiao.jpg">
                        </a>
                    </div>
                    <!-- 额外增加的一个节点(循环轮播:最后一个节点是第一张轮播) -->
                    <div class="mui-slider-item mui-slider-item-duplicate">
                        <a href="#">
                            <img src="images/shuijiao.jpg">
                        </a>
                    </div>
                </div>
                <div class="mui-slider-indicator">
                    <div class="mui-indicator mui-active"></div>
                    <div class="mui-indicator"></div>
                    <div class="mui-indicator"></div>
                    <div class="mui-indicator"></div>
                </div>
                <!--轮播-->

                <!--list-->
                <ul class="mui-table-view mui-table-view-chevron">
                    <li class="mui-table-view-cell mui-media">
                        <a class="mui-navigate-right" id="sub1.html">
                            <img class="mui-media-object mui-pull-left" src="images/cbd.jpg">
                            <div class="mui-media-body">
                                CBD
                                <p class='mui-ellipsis'>烤炉模式的城,到黄昏,如同打翻的调色盘一般.</p>
                            </div>
                        </a>
                    </li>
                    <li class="mui-table-view-cell mui-media">
                        <a class='mui-navigate-right' id="index.html">
                            <img class="mui-media-object mui-pull-left" src="images/yuantiao.jpg">
                            <div class="mui-media-body">
                                远眺
                                <p class='mui-ellipsis'>静静的看这个世界,最后终于疯了</p>
                            </div>
                        </a>
                    </li>
                    <li class="mui-table-view-cell mui-media">
                        <a class="mui-navigate-right">
                            <img class="mui-media-object mui-pull-left" src="images/shuijiao.jpg">
                            <div class="mui-media-body">
                                幸福
                                <p class='mui-ellipsis'>能和心爱的人一起睡觉,是件幸福的事情;可是,打呼噜怎么办?</p>
                            </div>
                        </a>
                    </li>
                </ul>
                <!--list-->
            </div>
            <div id="tabbar-with-chat" class="mui-control-content">
                添加
            </div>
            <div id="tabbar-with-contact" class="mui-control-content">
                我的
            </div>
            <div id="tabbar-with-map" class="mui-control-content">
                设置
            </div>
        </div>
    </body>
    <script src="js/mui.min.js"></script>
    <script>
        mui.init({
            swipeBack: true //启用右滑关闭功能
        });

        mui("#slider").slider({
            interval: 1000
        });

        mui.ready(function() {

            mui(".mui-content").on("tap", ".mui-navigate-right", function() {
                var id =this.id;
                mui.openWindow({
                    url: id,
                    id: id,
                    extras: {
                        id: "1"
                    },
                    createNew: false, //是否重复创建同样id的webview,默认为false:不重复创建,直接显示
                    show: {
                        autoShow: true //页面loaded事件发生后自动显示,默认为true
                    },
                    waiting: {
                        autoShow: true, //自动显示等待框,默认为true
                        title: '正在加载...' //等待对话框上显示的提示内容
                    }
                });

            });

        });
    </script>

</html>

View Code

 

效果:

图片 64

此地运用HBuilder内置的MUI为例,新增d06.html,页面脚本如下:

<!DOCTYPE html>
<html>

    <head>
        <meta charset="utf-8">
        <title>淘水果</title>
        <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black">
        <!--标准mui.css-->
        <link rel="stylesheet" href="css/mui.min.css">
        <!--App自定义的css-->
        <link rel="stylesheet" type="text/css" href="css/app.css" />
        <style>
            .title {
                margin: 20px 15px 10px;
                color: #6d6d72;
                font-size: 15px;
            }

            .oa-contact-cell.mui-table .mui-table-cell {
                padding: 11px 0;
                vertical-align: middle;
            }

            .oa-contact-cell {
                position: relative;
                margin: -11px 0;
            }

            .oa-contact-avatar {
                width: 75px;
            }

            .oa-contact-avatar img {
                border-radius: 50%;
            }

            .oa-contact-content {
                width: 100%;
            }

            .oa-contact-name {
                margin-right: 20px;
            }

            .oa-contact-name,
            oa-contact-position {
                float: left;
            }
        </style>
    </head>

    <body>
        <header class="mui-bar mui-bar-nav">
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
            <h1 class="mui-title">淘水果</h1>
        </header>
        <nav class="mui-bar mui-bar-tab">
            <a class="mui-tab-item mui-active" href="#tabbar">

                畅销水果
            </a>
            <a class="mui-tab-item" href="#tabbar-with-chat">
                9
                新货上架
            </a>
            <a class="mui-tab-item" href="#tabbar-with-contact">

                收款
            </a>
            <a class="mui-tab-item" href="#tabbar-with-map">

                发货
            </a>
        </nav>
        <div class="mui-content">
            <div id="tabbar" class="mui-control-content mui-active">

                <div id="slider" class="mui-slider">
                    <div class="mui-slider-group mui-slider-lhttp://127.0.0.1:8020/HTML5_2_1/d06.html#oop">
                        <!-- 额外增加的一个节点(循环轮播:第一个节点是最后一张轮播) -->
                        <div class="mui-slider-item mui-slider-item-duplicate">
                            <a href="#">
                                <img src="images/yuantiao.jpg">
                            </a>
                        </div>
                        <!-- 第一张 -->
                        <div class="mui-slider-item">
                            <a href="#">
                                <img src="images/shuijiao.jpg">
                            </a>
                        </div>
                        <!-- 第二张 -->
                        <div class="mui-slider-item">
                            <a href="#">
                                <img src="images/muwu.jpg">
                            </a>
                        </div>
                        <!-- 第三张 -->
                        <div class="mui-slider-item">
                            <a href="#">
                                <img src="images/cbd.jpg">
                            </a>
                        </div>
                        <!-- 第四张 -->
                        <div class="mui-slider-item">
                            <a href="#">
                                <img src="images/yuantiao.jpg">
                            </a>
                        </div>
                        <!-- 额外增加的一个节点(循环轮播:最后一个节点是第一张轮播) -->
                        <div class="mui-slider-item mui-slider-item-duplicate">
                            <a href="#">
                                <img src="images/shuijiao.jpg">
                            </a>
                        </div>
                    </div>
                    <div class="mui-slider-indicator">
                        <div class="mui-indicator mui-active"></div>
                        <div class="mui-indicator"></div>
                        <div class="mui-indicator"></div>
                        <div class="mui-indicator"></div>
                    </div>
                </div>

                <ul class="mui-table-view mui-table-view-chevron" id="goodsList">

                </ul>

            </div>

            <div id="tabbar-with-chat" class="mui-control-content">
                <p>
                    <label for="name">名称:</label>
                    <input type="text" id="name" value="" />
                </p>
                <p>
                    <label for="price">价格:</label>
                    <input type="text" id="price" value="" />
                </p>
                <p>
                    <input type="hidden" id="goodsId" />
                    <button id="btnInsert">添加</button>
                    <button id="btnUpdate">更新</button>
                </p>
            </div>
            <div id="tabbar-with-contact" class="mui-control-content">
                <div class="title">这是div模式选项卡中的第3个子页面,该页面展示一个通讯录示例.</div>
                <ul class="mui-table-view mui-table-view-striped mui-table-view-condensed">
                    <li class="mui-table-view-cell">
                        <div class="mui-slider-cell">
                            <div class="oa-contact-cell mui-table">
                                <div class="oa-contact-avatar mui-table-cell">
                                    <img src="images/60x60.gif" />
                                </div>
                                <div class="oa-contact-content mui-table-cell">
                                    <div class="mui-clearfix">
                                        <h4 class="oa-contact-name">叶文洁</h4>
                                        董事长
                                    </div>
                                    <p class="oa-contact-email mui-h6">
                                        yewenjie@sina.com
                                    </p>
                                </div>
                            </div>
                        </div>
                    </li>
                    <li class="mui-table-view-cell">
                        <div class="mui-slider-cell">
                            <div class="oa-contact-cell mui-table">
                                <div class="oa-contact-avatar mui-table-cell">
                                    <img src="images/60x60.gif" />
                                </div>
                                <div class="oa-contact-content mui-table-cell">
                                    <div class="mui-clearfix">
                                        <h4 class="oa-contact-name">艾AA</h4>
                                        总经理
                                    </div>
                                    <p class="oa-contact-email mui-h6">
                                        aaa@163.com
                                    </p>
                                </div>
                            </div>
                        </div>
                    </li>
                    <li class="mui-table-view-cell">
                        <div class="mui-slider-cell">
                            <div class="oa-contact-cell mui-table">
                                <div class="oa-contact-avatar mui-table-cell">
                                    <img src="images/60x60.gif" />
                                </div>
                                <div class="oa-contact-content mui-table-cell">
                                    <div class="mui-clearfix">
                                        <h4 class="oa-contact-name">罗辑</h4>
                                        员工
                                    </div>
                                    <p class="oa-contact-email mui-h6">
                                        luoji@126.com
                                    </p>
                                </div>
                            </div>
                        </div>
                    </li>
                    <li class="mui-table-view-cell">
                        <div class="mui-slider-cell">
                            <div class="oa-contact-cell mui-table">
                                <div class="oa-contact-avatar mui-table-cell">
                                    <img src="images/60x60.gif" />
                                </div>
                                <div class="oa-contact-content mui-table-cell">
                                    <div class="mui-clearfix">
                                        <h4 class="oa-contact-name">云天明</h4>
                                        员工
                                    </div>
                                    <p class="oa-contact-email mui-h6">
                                        ytm@163.com
                                    </p>
                                </div>
                            </div>
                        </div>
                    </li>
                    <li class="mui-table-view-cell">
                        <div class="mui-slider-cell">
                            <div class="oa-contact-cell mui-table">
                                <div class="oa-contact-avatar mui-table-cell">
                                    <img src="images/60x60.gif" />
                                </div>
                                <div class="oa-contact-content mui-table-cell">
                                    <div class="mui-clearfix">
                                        <h4 class="oa-contact-name">史强</h4>
                                        员工
                                    </div>
                                    <p class="oa-contact-email mui-h6">
                                        shiqiang@gmail.com
                                    </p>
                                </div>
                            </div>
                        </div>
                    </li>
                </ul>
            </div>
            <div id="tabbar-with-map" class="mui-control-content">
                <div class="title">这是div模式选项卡中的第4个子页面,该页面展示一个常见的设置示例.</div>
                <ul class="mui-table-view">
                    <li class="mui-table-view-cell">
                        <a class="mui-navigate-right">
                            新消息通知
                        </a>
                    </li>
                    <li class="mui-table-view-cell">
                        <a class="mui-navigate-right">
                            隐私
                        </a>
                    </li>
                    <li class="mui-table-view-cell">
                        <a class="mui-navigate-right">
                            通用
                        </a>
                    </li>
                </ul>
                <ul class="mui-table-view" style="margin-top: 25px;">
                    <li class="mui-table-view-cell">
                        <a class="mui-navigate-right">
                            关于mui
                        </a>
                    </li>
                </ul>
                <ul class="mui-table-view" style="margin-top: 25px;">
                    <li class="mui-table-view-cell">
                        <a style="text-align: center;color: #FF3B30;">
                            退出登录
                        </a>
                    </li>
                </ul>
            </div>
        </div>
    </body>
    <script src="js/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/mui.min.js"></script>
    <script>
        //定义当前应用的对象
        var dbApp = {
            //打开数据库
            openDb: function() {
                //创建名称为products,版本为1.0,描述为产品数据库,3M大小的数据库
                this.db = openDatabase("products", 1.0, "产品数据库", 1024 * 1024 * 3, function() {
                    this.log("创建或打开数据库完成");
                });
            },
            //初始化
            init: function() {
                //打开或创建数据库
                this.openDb();
                //绑定事件
                this.bindEvent();
                //展示数据
                this.select();
                this.log("初始化完成");
            },
            //绑定事件
            bindEvent: function() {
                //添加事件
                $("#btnInsert").click(this.insert);
                $("#btnUpdate").click(this.update);
                $("#btnCreateTable").click(this.createTable);
                $("#btnDropTable").click(this.dropTable);
            },
            //显示消息
            log: function(info) {
                mui.toast(info);
            },
            //执行sql的通用方法 result.rowsAffected 影响行数
            //callback执行成功时的回调方法
            exeSql: function(sql, title, param, callback) {
                title = title || "操作";
                this.db.transaction(function(tx) {
                    tx.executeSql(
                        sql, param || [],
                        function(tx, result) {
                            dbApp.log(title + '成功');
                            if(callback) { //如果有参数
                                callback(result);
                            }
                        },
                        function(tx, error) {
                            dbApp.log(title + '失败' + error.message);
                        });
                });
            },
            //创建表
            createTable: function() {
                dbApp.exeSql("create table IF not EXISTS goods(id integer primary key autoincrement,name text not null,price double)", "创建表");
            },
            //删除表
            dropTable: function() {
                dbApp.exeSql("drop table IF EXISTS goods", "删除表");
            },
            //展示,加载数据
            select: function() {
                dbApp.exeSql("select id,name,price from goods", "查询", [], function(result) {
                    //将表格中tr索引大于0的元素删除
                    $("#goodsList li").remove();
                    for(var i = 0; i < result.rows.length; i++) {
                        var tr = $("<li class='mui-table-view-cell mui-media'><a class='mui-navigate-right'><img class='mui-media-object mui-pull-left' src='images/cbd.jpg'><div class='mui-media-body'>" + result.rows.item(i)["name"] + "<p class='mui-ellipsis'>新鲜好吃的水果,仅售:" + result.rows.item(i)["price"] + "/斤</p></div></a></li>")
                        tr.appendTo("#goodsList");
                    }
                    mui.init({
                        swipeBack: true //启用右滑关闭功能
                    });
                });
            },
            //插入数据
            insert: function() {
                //如果insert方法被绑定为事件,则this表示事件发生的对象
                dbApp.exeSql("insert into goods(name,price) values(?,?)", "添加", [$("#name").val(), $("#price").val()], function() {
                    dbApp.select();
                });
            },
            //删除 
            del: function(id, link) {
                dbApp.exeSql("delete from goods where id=?", "删除", [id], function(result) {
                    //查找a标签最近的一个tr父元素,移除
                    $(link).closest("tr").remove();
                });
            },
            //编辑
            edit: function(id) {
                dbApp.exeSql("select id,name,price from goods where id=?", "编辑", [id], function(result) {
                    $("#name").val(result.rows.item(0)["name"]);
                    $("#price").val(result.rows.item(0)["price"]);
                    $("#goodsId").val(result.rows.item(0)["id"]);
                    dbApp.log("修改后请保存");
                });
            },
            //更新
            update: function() {
                if($("#goodsId").val()) {
                    dbApp.exeSql("update goods set name=?,price=?  where id=?", "更新", [$("#name").val(), $("#price").val(), $("#goodsId").val()], function(result) {
                        dbApp.select();
                        $("#goodsId").val("");
                    });
                } else {
                    dbApp.log("请选择要更新的记录 ");
                }
            }
        };

        dbApp.init();
    </script>

</html>

包裹运行后的结果如下:

图片 65

七、示例下载

https://coding.net/u/zhangguo5/p/HTML502/git

github: https://github.com/zhangguo5/HTML5_2_1

mui示例: https://git.coding.net/zhangguo5/GoMallPro.git

装进下载

八、视频

https://www.bilibili.com/video/av16293468/

九、作业

9.1.1、再次出现每个教学示例。

9.1.2、用户登录,记住密码,接纳颜色,下次开拓页面时不须求输入密码,将背景观设置为用户挑选的水彩。Login.html,Admin.html

9.1.3、用SessionStorage判断用户是或不是登录,假使未登录转到页面Login.html

9.1.4、使用IndexedDb已毕如下效果:

图片 66

参考:

图片 67图片 68

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>IndexedDB-UI</title>
    </head>

    <body>
        <h2>IndexedDB-UI(NOSQL)</h2>

        <table border="1" cellspacing="1" cellpadding="1" id="tabGoods" width="100%">
            <tr>
                <th>序号</th>
                <th>编号</th>
                <th>名称</th>
                <th>价格</th>
                <th>操作</th>
            </tr>
        </table>

        <fieldset>
            <legend>商品信息</legend>
            <p>
                <label for="id">编号</label>
                <input type="text" name="id" id="id" value="" />
            </p>
            <p>
                <label for="name">名称</label>
                <input type="text" name="name" id="name" value="" />
            </p>
            <p>
                <label for="price">价格</label>
                <input type="number" name="price" id="price" value="" />
            </p>
            <p>
                <input type="button" id="btnSubmit" value="添加" />
                <input type="button" id="btnUpdate" value="更新" />
            </p>
        </fieldset>

        <h3 id="msg"></h3>
        <script src="../js/jQuery/jquery-1.11.3.min.js" type="text/javascript" charset="utf-8"></script>
        <script>
            //数据库
            var db;

            function init() {
                create();

                $("body").on("click", "#btnSubmit", {}, function() {
                    add();
                });

                $("#tabGoods").on("click", ".del", {}, function() {
                    if(confirm('您确定要删除吗?')) {
                        var tr = $(this).closest("tr");
                        del(tr.data("goods").id, function() {
                            alert('删除成功!');
                            tr.remove();
                        });
                    }
                });

                $("#tabGoods").on("click", ".edit", {}, function() {
                    var tr = $(this).closest("tr");
                    var obj = tr.data("goods");
                    $("#id").val(obj.id).prop("disabled", "disabled");
                    $("#name").val(obj.name);
                    $("#price").val(obj.price);
                });

                $("body").on("click", "#btnUpdate", {}, function() {
                    var obj = {
                        "id": $("#id").val(),
                        "name": $("#name").val(),
                        "price": $("#price").val()
                    };
                    edit(obj, function() {
                        alert('修改成功!');
                        getAll();
                    });
                    $("#id").val(obj.id).removeProp("disabled");
                });

            }
            init();

            //创建数据库与表
            function create() {
                //创建一个名称为gomall且版本为2的数据库,返回一个请求
                var request = indexedDB.open("gomallPro", 2);
                //绑定回调事件,成功时
                request.onsuccess = function(e) {
                    db = e.target.result;
                    log('创建数据库或打开数据库成功!');
                    getAll();
                };
                //失败时
                request.onerror = function(e) {
                    log("错误:" + e.target.errorCode || e.target.error);
                };
                //增加数据库版本号时,会触发onupgradeneeded事件(会在onsuccess之前被调用)
                request.onupgradeneeded = function(e) {
                    //创建对象存储空间(ObjectStore),类似表,goods是表名,id是主键,存储的是JSON
                    e.target.result.createObjectStore("goods", {
                        "keyPath": "id"
                    });
                    log("初始化数据库成功!");
                };
            }

            //新增数据
            function add() {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //javascript中的对象数组
                var item = {
                    "id": $("#id").val(),
                    "name": $("#name").val(),
                    "price": $("#price").val()
                };
                goods.add(item);
                log("添加数据成功!");
                getAll();
            }

            //更新对象
            function edit(item, callback) {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");

                //执行更新
                var request = goods.put(item);
                request.onsuccess = function(e) {
                    log(e.target.result);
                    if(callback) callback();
                };
            }

            //删除对象
            function del(key, callback) {
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //执行删除操作
                var request = goods.delete(key);
                //成功时的回调
                request.onsuccess = function(e) {
                    log(e.target.result);
                    log("删除成功!");
                    if(callback) callback();
                };
            }

            var index;
            //获得多个对象(游标)
            function getAll() {
                index = 1;
                //移除表格中除第一行以外的所有行
                $("#tabGoods tr:gt(0)").remove();
                //创建事务对象
                var tx = db.transaction("goods", "readwrite");
                //从数据库中获得存储对象,表
                var goods = tx.objectStore("goods");
                //打开游标
                var request = goods.openCursor();
                //成功时的回调
                request.onsuccess = function(e) {
                    //获得游标
                    var cursor = e.target.result;
                    if(cursor) { //如果不为空
                        var obj = cursor.value;
                        genTr(obj);
                        //下移
                        cursor.continue();
                    }
                };
            }

            function genTr(goods) {
                var tr = $("<tr/>").data("goods", goods);
                $("<td/>").html(index++).appendTo(tr);
                $("<td/>").html(goods.id).appendTo(tr);
                $("<td/>").html(goods.name).appendTo(tr);
                $("<td/>").html(goods.price).appendTo(tr);

                var btnDel = $("<input type='button' value='删除' class='del'/>");
                var btnEdit = $("<input type='button' value='编辑' class='edit'/>");

                $("<td/>").append(btnDel).append(btnEdit).appendTo(tr);

                tr.appendTo($("#tabGoods"));
            }

            //显示消息
            var msg = document.getElementById("msg");

            function log(m) {
                msg.innerHTML += m + "<br/>";
            }
        </script>
    </body>
</html>

View Code

运行结果:

图片 69

9.2.1、落成一个密码管理器APP

图片 70

图片 71

javascript得到url中的参数

//方法一:采用正则表达式获取地址栏参数
function GetQueryString(name)
{
     var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
     var r = window.location.search.substr(1).match(reg);
     if(r!=null)return  unescape(r[2]); return null;
}

 

网站地图xml地图