在开发的过程中,不一定所有数据都是单条存储的,有的时候也会出现将多条数据进行
整合,以另外一种形式存储数据库。
这篇文章介绍的就是将一个表格形式的数据转化成json格式进行存储。
此处给出的实例图如下:
可以看见这个表格中包含了input输入框,select选择框以及button删除按钮。需要实现的功能为将input输入框和select选择框中的数据进行存储,而button按钮选择不存储。
本文给出的思路是通过选择器得到tbody,然后再查找其中的tr,再通过tr选择其中的td进行逐层转换并逐层回传进行信息的整合。
源码如下:
Html代码:
<div class="panel panel-primary"> <div class="panel-heading">信息表 <button type="button" class="btn btn-default" onclick="addItems()">添加项目 </button> </div> <div class="panel-body"> <table class="table table-bordered table-hover" id="sampleTable"> <thead>${tableMap}</thead> <tbody> </tbody> </table> </div> <input type="hidden" value="" name="sampleInfo" id="sampleInfo"> </div>
Javascript代码:
function submit2() { var tbody = $("#sampleTable").find("tbody"); changeTbodyToDetail(tbody); $("#concreteForm").find("sampleInfo").val(changeTbodyToDetail(tbody)); $("#concreteForm").submit(); return false; } //结合本段js代码和html代码,可以看出这一方法是通过将表格信息进行格式转换后存储在属性为hidden的输入框中,在后台进行存储的。 //从一个tbody中获取数据并置入隐藏域 function changeTbodyToDetail(tbody) { var result = ""; tbody.find("tr").each(function () { var b = changeTrToDetail($(this)); result = result + b + ";"; }); result = result.substring(0, result.length - 1); $("input[name='sampleInfo']").val(result); } //从一个tr中获取数据 function changeTrToDetail(tr) { var result = "{"; tr.find("td").each(function () { var a = changeTdToDetail($(this)); if (a!=""){ result = result + a + ","; } }); result = result.substring(0, result.length - 1); result = result + "}"; return result; } //从一个td中获取一个数据 function changeTdToDetail(id) { var input = id.find("input[type='text']"); if (input.length > 0) { var name = input.prop("name"); var val = input.val(); var result = name + ":\"" + val + "\""; return result; } else{ var select = id.find("select"); var name = select.prop("name"); var val = select.val(); if(name==undefined){ return ""; }else{ var result = name + ":\"" + val + "\""; return result; } } }
可以看出整个转换的方法是选择了嵌套的方法,把整个功能变成了changeTbodyToDetail、changeTrToDetail、changeTdToDetail三个方法。每一层的处理方法都不难理解,但是在changeTdToDetail中有几个细节是需要注意的,也是在调试过程中进行修改才完善的方法。
在changeTdToDetail中需要实现的功能是选择存储input输入框和select选择框的数据,拒绝录入button删除按钮。为实现这一功能,需要增加一个判断语句进行筛选。在本段代码中if判断筛选出了input输入框和非input输入框,前者进行数据存储,后者仍需要进一步判断。需要注意的是,select选择框不同于input输入框,不能用.length进行判断。而在addItems()中我们定义button控件不同于使用的另外两个控件,设置button没有name属性,此处就可以通过name属性进行下一步判断,如果为undefined即为按钮,返回一个空string,不为undefined则进行数据传值。
评论前必须登录!
注册