您好!欢迎访问家园网-www.jy.wang!

家园网

web sql 编辑留言板信息

网络 作者:本站 点击:

web sql 编辑留言板信息

js代码:

// JavaScript Document
function getE(ele) {
    return document.getElementById(ele);
}
var datalist = getE('datalist');
var result = getE('result');
var db = openDatabase('myData', '1.0', 'test database', 1024 * 1024);

if (!datalist) {
    datalist = document.createElement('dl');
    datalist.className = 'datalist';
    datalist.id = 'datalist';
    document.getElementById("mr-cont").appendChild(datalist);
}


db.transaction(function (tx) {
    tx.executeSql('CREATE TABLE IF NOT EXISTS MsgData(name TEXT,msg TEXT,time INTEGER)', []);

})
getE('clear').onclick = function () {//删除留言信息
    db.transaction(function (tx) {
        tx.executeSql('DROP TABLE MsgData', []);
    })
    showAllData();
}
getE('save').onclick = function () {//调用保存信息
    saveData();
    return false;
}

function removeAllData() {//从数据库中删除
    for (var i = datalist.children.length - 1; i >= 0; i--) {
        datalist.removeChild(datalist.children[i]);
    }
}

function showData(row) {//在HTML页面中展示留言信息
    var dt = document.createElement('dt');
    dt.innerHTML = row.name;
    var dd = document.createElement('dd');
    dd.innerHTML = row.msg;
    var tt = document.createElement('tt');
    var t = new Date();
    t.setTime(row.time);
    tt.innerHTML = t.toLocaleDateString() + " " + t.toLocaleTimeString();
    datalist.appendChild(dt);
    datalist.appendChild(dd);
    datalist.appendChild(tt);
}

function showAllData() {//从数据库中提取留言信息
    db.transaction(function (tx) {
        tx.executeSql('CREATE TABLE IF NOT EXISTS MsgData(name TEXT,msg TEXT,time INTEGER)', []);
        tx.executeSql('SELECT * FROM MsgData', [], function (tx, result) {
            removeAllData();
            for (var i = 0; i < result.rows.length; i++) {
                showData(result.rows.item(i));
            }
        });
    });
}

function addData(name, msg, time) {//向数据库中添加数据
    db.transaction(function (tx) {
        tx.executeSql('INSERT INTO MsgData VALUES(?,?,?)', [name, msg, time], function (tx, result) {
                alert("留言成功");
            },
            function (tx, error) {//添加失败提示
                alert(error.source + ':' + error.message);
            });
    });
}

function saveData() {//获取HTML中的数据
    var name = getE('name').value;
    var msg = getE('msg').value;
    var time = new Date().getTime();
    addData(name, msg, time);
    showAllData();
}


html代码:

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>用户登录界面</title>
<link href="css/css.css" rel="stylesheet" type="text/css">
    <body onLoad="showAllData();">
    <div class="mr-cont" id="mr-cont">
<form action="#" method="get" accept-charset="utf-8">
  <p class="form_item"> 用户名:
    <input type="text" id="name" required/>
  </p>
  <p class="form_item"> 留&nbsp;言:
    <textarea type="text" rows="10" cols="30" id="msg" required></textarea>
  </p>
  <p class="form_item">
    <input type="submit" id="save" value="保存"/>
    <input type="submit" id="clear" value="删除"/>
  </p>
  <hr><br/>
</form>
</div>
<script type="text/javascript" src="js/js.js"></script>
</body>
</html>


好的,我来逐行讲解这些代码,并特别说明 datalist 是谁以及删除逻辑。


一、JS 代码逐行讲解

1. 工具函数

javascript

function getE(ele) {
	return document.getElementById(ele);}

  • 这是一个简单的辅助函数,通过 ID 获取 DOM 元素,简化代码书写。


2. 获取元素

javascript

var datalist = getE('datalist');var result = getE('result');

  • datalist:尝试获取 ID 为 datalist 的元素。

  • result:尝试获取 ID 为 result 的元素(但后续代码中并未使用这个变量)。


3. 连接数据库

javascript

var db = openDatabase('myData', '1.0', 'test database', 1024 * 1024);

  • 这是 Web SQL Database(已废弃,但用于教学)的 API。

  • 打开名为 myData 的数据库,版本 1.0,描述为 test database,大小限制为 1MB。


4. 如果 datalist 不存在,则创建

javascript

if (!datalist) {
	datalist = document.createElement('dl');
	datalist.className = 'datalist';
	datalist.id = 'datalist';
	document.getElementById("mr-cont").appendChild(datalist);}

  • 如果页面上没有 ID 为 datalist 的元素,则动态创建一个 <dl>(定义列表)元素。

  • 设置它的 class 为 datalist,id 为 datalist

  • 然后将它添加到 ID 为 mr-cont 的元素内部(这个元素在 HTML 中存在,是留言区域的容器)。

这里回答你的问题:datalist 是谁?
datalist 是一个 <dl>(定义列表)元素,用于在页面上显示留言列表。每条留言包含:

  • <dt>:留言人姓名

  • <dd>:留言内容

  • <tt>:留言时间


5. 创建数据表

javascript

db.transaction(function (tx) {
	tx.executeSql('CREATE TABLE IF NOT EXISTS MsgData(name TEXT,msg TEXT,time INTEGER)', []);})

  • 启动一个数据库事务。

  • 创建名为 MsgData 的表(如果不存在),包含三个字段:

    • name:文本类型,存储用户名

    • msg:文本类型,存储留言内容

    • time:整数类型,存储时间戳


6. "删除"按钮的点击事件

javascript

getE('clear').onclick = function () {//删除留言信息
	db.transaction(function (tx) {
		tx.executeSql('DROP TABLE MsgData', []);
	})
	showAllData();}

  • 获取 ID 为 clear 的按钮(HTML 中有一个 value="删除" 的按钮)。

  • 点击时:

    1. 执行 SQL 语句 DROP TABLE MsgData删除整个数据表(所有留言数据永久丢失)。

    2. 调用 showAllData() 刷新页面显示(因为表被删了,显示会变空)。


7. "保存"按钮的点击事件

javascript

getE('save').onclick = function () {//调用保存信息
	saveData();
	return false;}

  • 获取 ID 为 save 的按钮(HTML 中有一个 value="保存" 的按钮)。

  • 点击时调用 saveData() 函数保存留言。

  • return false 阻止表单的默认提交行为(防止页面刷新)。


8. removeAllData() 函数 - 删除页面上的所有留言显示

javascript

function removeAllData() {//从数据库中删除
	for (var i = datalist.children.length - 1; i >= 0; i--) {
		datalist.removeChild(datalist.children[i]);
	}}

这是你重点问的函数,删除逻辑如下:

  • datalist.children:获取 <dl> 元素下的所有子元素(即所有留言的 <dt><dd><tt>)。

  • datalist.children.length - 1:最后一个子元素的索引。

  • 倒序循环(从最后一个开始删):

    • datalist.removeChild(datalist.children[i]):删除当前索引的子元素。

  • 为什么要倒序?
    如果正序删除(从索引 0 开始),每删一个,后面的子元素索引会前移,导致漏删或出错。倒序删除则安全。

注意:注释写的是"从数据库中删除",但实际上这个函数只删除页面上的 DOM 元素,不操作数据库
真正删除数据库的是上面"删除"按钮的 DROP TABLE


9. showData(row) - 在页面上显示一条留言

javascript

function showData(row) {//在HTML页面中展示留言信息
	var dt = document.createElement('dt');
	dt.innerHTML = row.name;
	var dd = document.createElement('dd');
	dd.innerHTML = row.msg;
	var tt = document.createElement('tt');
	var t = new Date();
	t.setTime(row.time);
	tt.innerHTML = t.toLocaleDateString() + " " + t.toLocaleTimeString();
	datalist.appendChild(dt);
	datalist.appendChild(dd);
	datalist.appendChild(tt);}

  • 创建 <dt> 元素,显示留言人姓名。

  • 创建 <dd> 元素,显示留言内容。

  • 创建 <tt> 元素,显示留言时间(将时间戳转为本地日期时间字符串)。

  • 将这三个元素依次添加到 datalist<dl>)中。


10. showAllData() - 从数据库读取并显示所有留言

javascript

function showAllData() {//从数据库中提取留言信息
	db.transaction(function (tx) {
		tx.executeSql('CREATE TABLE IF NOT EXISTS MsgData(name TEXT,msg TEXT,time INTEGER)', []);
		tx.executeSql('SELECT * FROM MsgData', [], function (tx, result) {
			removeAllData();  // 先清空页面显示
			for (var i = 0; i < result.rows.length; i++) {
				showData(result.rows.item(i));  // 逐条显示留言
			}
		});
	});}

  • 开启事务,确保表存在。

  • 查询 MsgData 表中的所有记录。

  • 查询成功后:

    1. 调用 removeAllData() 清空当前页面上的留言列表。

    2. 循环遍历查询结果,每条记录调用 showData() 在页面上显示。


11. addData() - 向数据库添加数据

javascript

function addData(name, msg, time) {//向数据库中添加数据
	db.transaction(function (tx) {
		tx.executeSql('INSERT INTO MsgData VALUES(?,?,?)', [name, msg, time], function (tx, result) {
				alert("留言成功");
			},
			function (tx, error) {//添加失败提示
				alert(error.source + ':' + error.message);
			});
	});}

  • 使用参数化查询插入一条留言记录。

  • 成功时弹出"留言成功"。

  • 失败时显示错误信息。


12. saveData() - 获取表单数据并保存

javascript

function saveData() {//获取HTML中的数据
	var name = getE('name').value;
	var msg = getE('msg').value;
	var time = new Date().getTime();
	addData(name, msg, time);
	showAllData();}

  • 获取用户名输入框(id="name")的值。

  • 获取留言内容输入框(id="msg")的值。

  • 获取当前时间戳(毫秒)。

  • 调用 addData() 存入数据库。

  • 调用 showAllData() 刷新页面显示。


二、HTML 代码逐行讲解

html

<!DOCTYPE html>

  • 声明 HTML5 文档类型。

html

<head><meta charset="UTF-8"><title>用户登录界面</title><link href="css/css.css" rel="stylesheet" type="text/css">

  • 设置字符编码为 UTF-8。

  • 页面标题"用户登录界面"(实际是留言板)。

  • 引入外部 CSS 样式文件。

html

<body onLoad="showAllData();">

  • 页面加载完成后执行 showAllData(),从数据库读取留言并显示。

html

<div class="mr-cont" id="mr-cont">

  • 留言区域的容器,id 为 mr-cont,如果 datalist 不存在,JS 会动态创建并追加到这个容器中。

html

<form action="#" method="get" accept-charset="utf-8">

  • 表单,提交地址为当前页(#),GET 方式。

html

<p class="form_item"> 用户名:  <input type="text" id="name" required/></p><p class="form_item"> 留&nbsp;言:  <textarea type="text" rows="10" cols="30" id="msg" required></textarea></p><p class="form_item">
  <input type="submit" id="save" value="保存"/>
  <input type="submit" id="clear" value="删除"/></p><hr><br/></form>

  • 用户名输入框,id="name",必填。

  • 留言文本域,id="msg",必填。

  • 两个提交按钮:保存和删除。

  • required 属性表示必须填写才能提交(但 JS 的 return false 阻止了实际提交)。

html

</div><script type="text/javascript" src="js/js.js"></script></body></html>

  • 容器结束。

  • 引入外部 JS 文件(就是上面讲解的那些代码)。

  • 页面结束。


三、总结:datalist 和删除逻辑

datalist 是谁?

datalist 是一个动态创建或已存在的 <dl> 元素,位于 <div id="mr-cont"> 中,用于展示留言列表。
每条留言包含三个子元素:<dt>(姓名)、<dd>(内容)、<tt>(时间)。

删除逻辑是什么?

有两处删除:

  1. 删除页面显示removeAllData()

    • 倒序遍历 datalist 的所有子元素并移除。

    • 只影响页面显示,不影响数据库。

  2. 删除数据库数据("删除"按钮)

    • 执行 DROP TABLE MsgData,删除整个表(所有数据永久丢失)。

    • 然后调用 showAllData() 刷新页面(此时表已空,页面为空)。

注意:注释中 removeAllData() 写的是"从数据库中删除"并不准确,它只是清空页面。真正的数据库删除是"删除"按钮的 DROP TABLE


标签: