需求:在一张页面中创建若干个子问题。创建数量不确定,子问题没有主键ID可查。页面内容和子问题内容存在主外键关系。点击“保存”时,将主表内容和子问题内容一同保存进数据库。页面如下图:


主表和子表数据库主外键结构如图:


添加位置的HTML代码为:

<div id="J_FankuiList">
<!-- 添加子表格位置 -->
</div>


解决方案:

1、在页面“新建选项内容”中添加 onclick 方法οnclick="newFankui(this);"

<button type="button" οnclick="newFankui(this);" id="newFankuiPropertyButton" class="">新建选项内容</button>


2、在JS中创建 newFankui() 方法:

function newFankui(obj){
 	$("#J_FankuiList").append(fankui());
}

3、创建 fankui() 方法,用来生成需要的子表格式:

function fankui(iz){
	var html = "";
	html += "<div class='sku-div-in-controls'>";
	html += "	<div class='hidentop5px'>";
	html += "		<ul>";
	html += "			<li class='marginright5'>";
	html += "				<input type='hidden' name='optionId'/>";
	html += "			</li>";
	html += "			<li class='marginright5'>选项名称:";
	html += "				<input type='text' name='name' id='paramValue0' class='text required' maxlength='10' />";
	html += "			</li>";
	html += "			<li class='marginright5'>排序序号:";
	html += "				<input type='text' name='sequence' id='paramValue1' class='text required' maxlength='10' />";
	html += "			</li>";
	html += "			<li class='marginright5'>是否默认选择:<br/>";
	html += "				<select name='checked'>";
	html += "					<option value='1' class='required'>选中</option>";
	html += "					<option value='0' class='required'>非选中</option>";
	html += "									";	
	html += "				</select>";
	html += "			</li>";
	html += "		</ul>";
	html +="		<div>";
	html +="			<a title='删除' href='javascript:void(0);'";
	html +="				οnclick='delFankui(this);'>删除</a>";
	html +="		</div>";
	html +="		<div></div>";
	html +="	</div>"	;
	html +="</div>"	;
	iz++;
	return html;
}

4、因为3中涉及到“删除”功能,所以创建对应的方法 delFankui(obj)

function delFankui(obj){
	$(obj).parent().parent().parent().remove();
 	$("#J_AddCustomSKU").attr("class","");
 	$("#J_AddCustomSKU").attr("onclick","addSkuList(this)");
	$("#newFankuiPropertyButton").attr("class","");
	$("#newFankuiPropertyButton").attr("onclick","newFankui(this);");

}

5、以上表格已经建好。下面需要填写表格内容,并获取。这里使用JS中的 JSON.stringify() 方法生成Json串儿。

function feedbackProperty(){
	var feedbackMap = new Map();
	var valueList = null;
	
	var outerLength = $(".sku-div-in-controls > .hidentop5px > ul").get();	//外部“选项内容的集合”
	
	
	for(var i=0; i<outerLength.length; i++){
		if(valueList ==null){
			valueList = new Array();
		}
		//手机所有input=hidden对象
		var valueHiddenList = $(outerLength[i]).parent().find(" ul > .marginright5 > input[type='hidden']").get();
		
		//收集所有input=text对象
		var valueTextList = $(outerLength[i]).parent().find(" ul > .marginright5 > input[type='text']").get();
		
		//收集所有input=selected对象
		var valueSelect = $(outerLength[i]).parent().find("ul > .marginright5 > select option:selected").get();
		
		//将input=hidden的值压入list
		var a = $.trim($(valueHiddenList).val());
		if(a!=null && a!="" && a!= undefined){
			valueList.push(a);
		}else{
			a = "0";
			valueList.push(a);
		}
		
		//内循环2次,将input=text的值压入list
		for(var j=0;j<3; j++){
			if($(valueTextList[j]).val()!=null && $(valueTextList[j]).val() !="" && $(valueTextList[j]).val() != undefined){
				valueList.push($.trim($(valueTextList[j]).val())); 
			}
		}
		//将selected的值压入list
		valueList.push($.trim($(valueSelect).val()));
		var option = "option"+i;
		feedbackMap.put(option, valueList);
		valueList = null;
	}
	var json = JSON.stringify(feedbackMap.getElements());
	if($("#feedback_value").val()!=null){	//#feedback_value不为空时,清空
		$("#feedback_value").val();
	}
	$("#feedback_value").val(json);
}

以上方法的思路是:

1)、创建一个Map用来装最后的JSON数据

2)、再创建一个List存储key:value中的value值。设计最后的JSON格式为[{key:[data1,data2,data3]}]

3)、通过JQuery获取所有三个数据对应的 <input >标签个数(见 $(".sku-div-in-controls > .hidentop5px > ul").get() )

4)、遍历所有 dom 元素,分别找到属性为 hidden、text和selected的<input>元素

5)、分别将以上元素的值存入2中的List中,顺序为[hidden,text,text,selected](这里是表单属性顺序)

6)、因为 JSON.stringify() 生成的json格式为[{"key":"a","value":["a1","a2","a3","a4"]},{"key":"b","value":["b1","b2","b3","b4"]}],所以要为每个对象生成一个key对应的name值,所以在4的循环中手动生成一个name名。

var option = "option"+i;

feedbackMap.put(option, valueList);

7)、将生成好的map作为参数存放进 var json = JSON.stringify(map) 中。将json值存入 id为feedback_value 的hidden 中。


6、生成json的方法完成。下面如何在不使用 Ajax 的情况下调用该方法。(不用Ajax是因为我目前不会Ajax):

在“保存”按钮中添加一个 οnmοuseοver="feedbackProperty()" 方法,表示当鼠标划过“保存按钮”时,就调用生成json的方法。这样就可以把json传递给后台获取。


以上就是利用JQuery完成动态创建子表的过程。







GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐