本文将介绍一个组件化的可编辑数据表格的设计思路、实现方法和核心代码及注解。同时,也会探讨基于数据的Web页面设计与开发思路和方法。
一、设计思路
在设计可编辑数据表格时,我们需要考虑以下几个方面:
1. 数据源:表格需要从哪里获取数据?如何将数据传递给表格组件?
2. 表格结构:表格应该具有哪些列?每列的数据类型是什么?如何定义表头和表格内容?
3. 编辑功能:如何实现表格的编辑功能?如何保存编辑后的数据?
4. 组件化:如何将表格封装成一个可复用的组件?
二、实现方法和核心代码及注解
1. 撰写一个可编辑的表格的大体框架,包含一个输入框和一个“新增”按钮,以及一个已经填充好数据的表格。在输入框中输入商品名称、价格和数量,点击“新增”按钮,就可以在表格中新增一行数据,同时计算出总价。表格中的数据可以随意修改,修改后总价也会自动更新:
<div id="tableBox">
<h2 class="title">可编辑表格</h2>
<div class="err">输入有误,请重新输入!</div>
<div class="table1" name="add">
<h>商品:</h>
<input type="text" class="name" />
<h>价格:</h>
<input type="text" class="price" />
<h>数量:</h>
<input type="text" class="num" />
<button id="add">新增</button>
</div>
<table class="table2">
<thead>
<tr>
<th>商品</th>
<th>价格</th>
<th>数量</th>
<th>总价</th>
</tr>
</thead>
<tbody>
<tr>
<td name="goods">鼠标</td>
<td name="price">98</td>
<td name="num">2</td>
<td name="AllPrice">196</td>
</tr>
<tr>
<td name="goods">桌子</td>
<td name="price">150</td>
<td name="num">3</td>
<td name="AllPrice">450</td>
</tr>
<tr>
<td name="goods">滑板</td>
<td name="price">231</td>
<td name="num">3</td>
<td name="AllPrice">693</td>
</tr>
<tr>
<td name="goods">钟</td>
<td name="price">111</td>
<td name="num">2</td>
<td name="AllPrice">222</td>
</tr>
</tbody>
</table>
</div>
2.通过获取 DOM 元素的方式,获取了表格、价格、数量、错误提示、行和添加按钮等元素:
var stutable = document.getElementsByClassName("table2")[0];
var prices = document.getElementsByName("price");
var nums = document.getElementsByName("num");
var thetips = document.getElementsByClassName("err")[0];
var trs = document.getElementsByTagName("tr");
var add = document.querySelector("#add");
3.给价格(prices)和数量(nums)的每个单元格添加点击事件,当单元格被点击时,会调用updateCell函数进行更新操作。其中,updateCell函数的具体实现需要进一步查看代码:
function setCellCilck() {
for (var i = 0; i < prices.length; i++) {
for (var j = 0; j < nums.length; j++) {
prices[i].onclick = function () {
updateCell(this);
};
nums[j].onclick = function () {
updateCell(this);
};
}
}
}
setCellCilck();
4.更新一个 HTML 元素的内容。具体来说,它会将该元素的原始内容保存到一个变量 oldhtml 中,然后将该元素的内容清空,并创建一个 input 元素,将其添加到该元素中。这个 input 元素的 class 属性被设置为 "active-input",并且它的 value 属性被设置为 oldhtml。当 input 元素失去焦点时,会触发一个 onblur 事件处理函数。如果 input 元素的值不是数字,或者超出了一定范围,那么会显示一个错误提示框。否则,该元素的内容会被更新为 input 元素的值,并调用 updateScore 函数更新分数。如果已经存在一个 class 为 "active-input" 的元素,则不会执行任何操作:
function updateCell(newhtml) {
if (document.getElementsByClassName("active-input").length == 0) {
var oldhtml = newhtml.innerHTML;
newhtml.innerHTML = "";
var newInput = document.createElement("input");
newInput.setAttribute("class", "active-input");
newInput.value = oldhtml;
newInput.onblur = function () {
if (!Number(this.value) || this.value > 500 || this.value < 0) {
console.log("err");
addAnimate();
thetips.style.display = "block";
return;
} else {
thetips.style.display = "none";
newhtml.innerHTML = this.value == oldhtml ? oldhtml : this.value;
updateScore();
}
};
newInput.select();
newhtml.appendChild(newInput);
newInput.focus();
} else {
return;
}
}
5. 实现一个简单的商品列表添加功能的。当点击按钮(add)时,会创建一个新的tr元素,并将输入框中的商品名称、价格、数量和总价添加到新的tr元素中,最后将新的tr元素添加到表格(tbody)中:
var tbody = document.querySelector("tbody");
var goods = document.querySelector(".name");
var price = document.querySelector(".price");
var num = document.querySelector(".num");
var td = document.createElement("td");
var td2 = document.createElement("td");
var td3 = document.createElement("td");
var td4 = document.createElement("td");
add.addEventListener("click", function () {
var tr = document.createElement("tr");
tbody.appendChild(tr);
td.innerHTML = goods.value;
td2.innerHTML = price.value;
td3.innerHTML = num.value;
td4.innerHTML = parseInt(price.value * num.value);
tr.appendChild(td);
tr.appendChild(td2);
tr.appendChild(td3);
tr.appendChild(td4);
tbody.appendChild(tr);
});
6. 实现更新表格中的价格和数量信息。具体来说,它遍历表格中的每一行,获取该行中的价格和数量单元格,计算出总价,并将总价更新到该行的总价单元格中。最后,调用该函数即可更新表格中的所有总价信息。
function updateScore() {
for (let n = 1; n < trs.length + 1; n++) {
var price1 = prices[n].querySelectorAll("td[name]");
var num1 = nums[n].querySelectorAll("td[name]");
var allprice = prices[n].querySelectorAll("td[name]");
var all = 1;
for (var i = 0; i < price1.length; i++) {
all = parseFloat(price1[i].value * num1[i].value);
for (var m = 0; m < allprice.length; m++) {
allprice[m].innerHTML = all;
}
}
}
}
updateScore();
三、拓展思考
基于数据的Web页面设计与开发思路和方法,可以从以下几个方面进行拓展思考:
1. 数据可视化:如何将数据以可视化的方式呈现给用户?如何设计数据可视化的交互方式?
2. 数据分析:如何对数据进行分析?如何设计数据分析的算法和模型?
3. 数据安全:如何保护用户数据的安全?如何防止数据泄露和攻击?
4. 数据交互:如何设计数据交互的接口和协议?如何实现数据的跨平台和跨设备交互?