1. 程式人生 > >Layui資料表格動態新增行的處理方式(原生HTML方式)

Layui資料表格動態新增行的處理方式(原生HTML方式)

專案需求:動態的增加表格行資料,並且單元格允許支援下拉框。

解決步驟:

1、編寫表格頭部內容

<hr class="layui-bg-green">
				<div class="layui-form-item">
					<div class="layui-input-inline">
						<a class="layui-btn layui-btn-sm add_tr_btn"><i class="layui-icon">&#xe608;</i>新增資訊項(共<cite id="count">0</cite>項)</a>
					</div>
				</div>
<form class="layui-form res_field_form">
				<div class="layui-form-item">
					<table class="layui-table" lay-filter="resTable" id="resTable">
						<thead>
							<tr>
								<th>資訊項名稱</th>
								<th>資訊項編碼</th>
								<th>資訊項型別</th>
								<th>資訊項長度</th>
								<th>是否為空</th>
								<th>顯示序號</th>
								<th>是否共享</th>
								<th>共享方式</th>
								<th>是否公開</th>
								<th>公開方式</th>
								<th>操作</th>
							</tr>
						</thead>
						<tbody>
						</tbody>
					</table>
				</div>
				<div class="layui-form-item">
					<label for="L_repass" class="layui-form-label">
					</label>
					<a class="layui-btn add_res_btn">儲存</a>
				</div>
			</form>

2、編寫動態生成資料行的JS程式碼,使用拼接HTML方式,具體邏輯可參考程式碼。(此方法比較繁瑣,亦可用其他方式)

$(document).ready(function(){
		layui.use(['jquery','table','form'], function(){
			var table = layui.table,
			    $ = layui.jquery,
				form = layui.form;
			//新增行按鈕
			$(".add_tr_btn").click(function(){
				var tableRow = HTable.ADD_TR(HTable.trNum);
				var trObj = $("#resTable").children('tbody').find('tr');
				var tbody = $("#resTable").find('tbody');
				tbody.append(tableRow);
				form.render();
			});
			//儲存按鈕
			$(".add_res_btn").click(function(){
				//var json = $(".res_field_form").serializeJSON();
				var result = $(".res_field_form").parseFormJSON();
				alert(JSON.stringify(result));
			});
		});
	});
	//定義HTable物件
	window.HTable = {
		trNum:1,
		count:0,
		DEL_TR:function(trNum){
			$("#tr"+trNum).remove();
			this.trNum--;
			if(this.trNum==0){
				this.trNum=1;
			}
			this.count--;
			if(this.count<0){
				this.count=0;
			}
			$("#count").text(this.count);
		},
		ADD_TR:function(trNum){
			var IsNullHtml = "<select name='fieldIsNull'><option value='YES' selected>是</option><option value='NO'>否</option></select>";
			var IsShareHtml = "<select name='fieldIsShare'><option value='YES' selected>是</option><option value='NO'>否</option></select>";
			var ShareTypeHtml = "<select name='fieldShareType'><option value='CONDITION' selected>有條件</option><option value='UNCONDITION'>無條件</option></select>";
			var IsPublicHtml = "<select name='fieldIsPublic'><option value='YES' selected>是</option><option value='NO'>否</option></select>";
			var PublicTypeHtml = "<select name='fieldPublicType'><option value='CONDITION' selected>有條件</option><option value='UNCONDITION'>無條件</option></select>";
			var result = "<tr id='tr"+trNum+"'>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='fieldName' class='layui-input'/></div></td>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='fieldCode' class='layui-input'/></div></td>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='fieldType' class='layui-input'/></div></td>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='fieldLength' class='layui-input'/></div></td>"+
			             "<td><div class='layui-iput-inline'>"+IsNullHtml+"</div></td>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='fieldSort' class='layui-input'/></div></td>"+
						 "<td><div class='layui-iput-inline'>"+IsShareHtml+"</div></td>"+
						 "<td><div class='layui-iput-inline'>"+ShareTypeHtml+"</div></td>"+
						 "<td><div class='layui-iput-inline'>"+IsPublicHtml+"</div></td>"+
						 "<td><div class='layui-iput-inline'>"+PublicTypeHtml+"</div></td>"+
						 "<td><a class='layui-btn layui-btn-sm layui-btn-danger' onclick='HTable.DEL_TR("+trNum+")'>刪除</a></td>"+
						 "</tr>";
			this.trNum++;
			this.count++;
			$("#count").text(this.count);
			return result;
		},
		TR_ROW:function(trNum,trHtml){
			
		}
	
	}

說明:

1)HTable.DEL_TR是直接繫結到<a>標籤中,亦可考慮動態繫結的方式。

2)HTable物件中主要定義了增加行、刪除行方法,並且以當前行的Index作為引數。

3)暫未考慮現實序號,由於動態選擇刪除行,需要重新繪製序號,增加了額外工作量,所以僅在頂部展示目前以增加的數量。

3、將動態表格中的資料行轉成JSON陣列的形式提交到後臺。

//原生JS的方式實現構建JSON陣列
$.fn.parseFormJSON = function (){
		var result = [];
		var json = {};
		var data = this.serializeArray();
		if(data.length==0){
			return [];
		}else{
			for(var i=0; i<data.length; i++){
				var key = data[i].name;
				var value = data[i].value;
				if(json.hasOwnProperty(key)){//當存在是
					result.push(json);
					//var newJson = {};
					json = {};//
					json[key] = value;
				}else{
					json[key] = value;
					if(i==data.length-1){
						result.push(json);
					}
				}
			}
		}
		return result;
	};

說明:1)可使用原生的JS方式實現組裝成JSON陣列;2)亦可以參考jquery.serializeJSON的實現方式,但此種方式提交的資料為JSON物件,需要到後臺再進行一次轉換才行。

ADD_TR:function(trNum){
			var IsNullHtml = "<select name='["+trNum+"][fieldIsNull]'><option value='YES' selected>是</option><option value='NO'>否</option></select>";
			var IsShareHtml = "<select name='["+trNum+"][fieldIsShare]'><option value='YES' selected>是</option><option value='NO'>否</option></select>";
			var ShareTypeHtml = "<select name='["+trNum+"][fieldShareType]'><option value='CONDITION' selected>有條件</option><option value='UNCONDITION'>無條件</option></select>";
			var IsPublicHtml = "<select name='["+trNum+"][fieldIsPublic]'><option value='YES' selected>是</option><option value='NO'>否</option></select>";
			var PublicTypeHtml = "<select name='["+trNum+"][fieldPublicType]'><option value='CONDITION' selected>有條件</option><option value='UNCONDITION'>無條件</option></select>";
			var result = "<tr id='tr"+trNum+"'>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='["+trNum+"][fieldName]' class='layui-input'/></div></td>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='["+trNum+"][fieldCode]' class='layui-input'/></div></td>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='["+trNum+"][fieldType]' class='layui-input'/></div></td>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='["+trNum+"][fieldLength]' class='layui-input'/></div></td>"+
			             "<td><div class='layui-iput-inline'>"+IsNullHtml+"</div></td>"+
						 "<td><div class='layui-iput-inline'><input type='text' name='["+trNum+"][fieldSort]' class='layui-input'/></div></td>"+
						 "<td><div class='layui-iput-inline'>"+IsShareHtml+"</div></td>"+
						 "<td><div class='layui-iput-inline'>"+ShareTypeHtml+"</div></td>"+
						 "<td><div class='layui-iput-inline'>"+IsPublicHtml+"</div></td>"+
						 "<td><div class='layui-iput-inline'>"+PublicTypeHtml+"</div></td>"+
						 "<td><a class='layui-btn layui-btn-sm layui-btn-danger' onclick='HTable.DEL_TR("+trNum+")'>刪除</a></td>"+
						 "</tr>";
			this.trNum++;
			this.count++;
			$("#count").text(this.count);
			return result;
		},
		TR_ROW:function(trNum,trHtml){
			
		}