html table重复表单组转json数组

最近遇到个需求,需要录入相同类型数据多组,并提交给后台,并且需要动态添加组数据(如图),开始采用form表单形式,但每组数据的name属性形同,导致form数组获取异常。

动态添加删除数据容易实现,在动态添加元素时,每组tr应有相同的class或者以数字结尾的自增id,以确保后期可通过该属性获取组元素,代码如下:

/*添加新一栏*/
    function addTable(){
        var trHTML ="";
        trHTML += '<tr class="table_group_value">'
			+'<td> <input name="title" type="text" > </td>'
			+'<td> <textarea name="desc" type="text" ></textarea> </td>'
			+'<td> <input name="price" type="text" > </td>'
			+'<td> <select name="style"><option value="novel">小说</option> <option value="fiction">科幻</option> </select> </td>'
			+'<td> <button type="button" onclick="delTable(this)">移除</button> </td>'
		  +'</tr>';
        $("#mytable_tbody").append(trHTML); //在表之后添加空白行   
      }
	  
	  /*删除一栏*/
    function delTable(obj){
        $(obj).parent().parent().remove();  
	}

获取数据未采用form格式,而是通过jquery选择器和 find函数实现,

1.先通过Jquery选择器获取每组的tr,并在循环内创建每组数据的json对象。

2.通过find函数遍历当前tr内指定的表单元素,本文例子中有input,textarea,select。

3.通过attr函数获取表单元素的name和值,并将数据加入到json对象中。

4.将每组json对象加入到json数组中。

代码如下:

function getData() {
			//重复表单元素
			var formdata={};
            var arr_sub_form = [];//重复子数据列表
            //遍历含有主数据的tr ***核心重点***
			//也可使用id,但每个tr的id必须以自增数字结尾 如 id=mytr0,mytr1,mytr2...,//$('tr[id^="mytr"]').each(function(){
            $('tr[class^="table_group_value"]').each(function(){
				var form_sub_data = {};
				//获取所有input
                $(this).find("input[type='text']").each(function(){
                  form_sub_data[$(this).attr("name")]=$(this).val();
                });
				//获取所有select
				$(this).find("select").each(function(){
                  form_sub_data[$(this).attr("name")]=$(this).val();
                });
				//获取所有textarea
				$(this).find("textarea[type='text']").each(function(){
                  form_sub_data[$(this).attr("name")]=$(this).val();
                });
				arr_sub_form.push(form_sub_data);
            });
			formdata['sub_data']=arr_sub_form;
			
			//非重复表单元素
			var arr_main_form = [];//非重复数据列表
			var form_main_data = {};
			$('tr[class^="table_main_value"]').each(function(){
				//获取所有input
                $(this).find("input[type='text']").each(function(){
                  form_main_data[$(this).attr("name")]=$(this).val();
                });
            });
			arr_main_form.push(form_main_data);
			formdata['main_data']=arr_main_form;
            console.log('formdata',formdata);
		}

本文同时将表内非重复元素也添加到json中,整个json分为非重复数据(整表信息),重复类型数据(每组表数据)。

演示及最终结果如下:

{
    "sub_data": [
        {
            "title": "java", 
            "price": "12", 
            "style": "novel", 
            "desc": "java知识"
        }, 
        {...}, 
        {
            "title": "C++", 
            "price": "15", 
            "style": "novel", 
            "desc": "C++"
        }
    ], 
    "main_data": [
        {
            "admin": "张三", 
            "time": "周一"
        }
    ]
}

当然还有其他办法,暂未细查。

添加了清空按钮:

源码:https://codechina.csdn.net/qq_24915489/html/-/blob/290e52e8b0f41a3c21a0d9d61c9f42335e62c733/table_data_2json.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值