本例使用了jquery
同时加入了jquery ui 的sortable来进行排序(也仅使用了ui的该功能)(如不想引入jqueryui可直接删除相应事件绑定即可。)
<!DOCTYPE html PUBdivC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World jQuery!</title>
<link type="text/css" href="css/ui-lightness/jquery-ui-1.7.2.custom.css" rel="stylesheet" />
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.7.2.custom.min.js"></script>
<style type=text/css>
body{font-family:Verdana,宋体; font-size:12px; margin:5px; padding:5px; }
#sortable { margin: 0; padding: 0; width: 700px; align:center;}
.tagView{width:100%;}
.tagEdit{};
.titleInput{width:150px;}
.valueInput{width:200px;}
.selectInput{width:100px;}
.item-capital, .itemDiv .item-capital { border: 1px solid #cccccc; background-color: #f6f6f6; font-weight: bold; color: #1c94c4; outline: none;height:100%; }
.itemDiv { border: 1px solid #dddddd; background: #eeeeee; color: #333333; height:100%; margin:5px; }
.item-content{border-bottom:1px solid #cccccc;width:100%;height:25px;line-height:25px;}
.item-content table{width:100%;}
.item-content table tr{width:100%;}
.item-content table td{white-space:nowrap;}
.item-capital{width:100%;height:25px;line-height:25px;}
.item-capital table{width:100%;}
.item-capital table tr{width:100%;}
.item-capital table td{white-space:nowrap;}
.tdBtn{text-align:right;}
.tdTitle{width:30%;}
.tdValue{white-space:nowrap;background-color:white;width:60%;}
.perviewTable{background-color: #cccccc; color: #333333; height:20px; margin:5px; width:600px;borde:1px solid red;}
.perviewCapital{background: #f6f6f6; font-weight: bold; color: #1c94c4;}
.perviewCapital th{text-align:center; }
.perviewTR{}
.perviewTR .title{width:30%;text-align:right;background: #eeeeee; }
.perviewTR .tag{width:70%;background-color:white;text-align:left;}
#editTable legend{width:100%;}
#editTable legend table{width:100%;}
#editTable legend #title{width:5%;white-space:nowrap;}
#editTable legend #line{width:95%;white-space:nowrap;}
#editTable legend #btn{white-space:nowrap;}
</style>
</head>
<body>
<div style="width:700px;">
<fieldset id=editTable>
<legend>
<table>
<tr><td id=title>配置表单</td><td id=line><hr/></td><td id=btn><input id=addItem type=button value=添加大项 ><td></tr>
</table>
</legend>
<div id=sortable>
<div class=itemDiv>
<div class=item-capital >
<table>
<tr>
<td class=tdTitle>
<div class=capitalView style=display:none></div>
<div class=capitalEdit >
<input class=titleInput type=text value=标题 />
</div>
</td>
<td class=tdBtn style=width:70%;text-align:right; >
<input class=btnAddItem type=button value=添加 onclick=addContent(this) /><input class=btnAddItem type=button value=删除 onclick=deleteItem(this) />
</td>
</tr>
</table>
</div>
<div class=item-content>
<table><tr>
<td class=tdTitle>
<div class=capitalView style=display:none></div>
<div class=capitalEdit >
<input class=titleInput type=text value=小标题 />
</div>
</td>
<td> :
</td>
<td class=tdValue>
<div class=tagView style=display:none ></div>
<div class=tagEdit >
<select class=selectInput value=text>
<option value=text>文本框</option>
<option value=select>下拉框</option>
<option value=textarea>文本域</option>
<option value=radio>单选按钮</option>
<option value=checkbox>多选按钮</option>
</select>
<input class=valueInput type=text value=预设值 /><input class=nullable type=checkbox value=nullable>必填</input>
</div>
</td>
<td class=tdBtn style=text-align:right; >
<input class=btnAddItem type=button value=删除 onclick=deleteContent(this) />
</td>
</tr></table>
</div>
</div><!--end itemDiv-->
<div><!--end sortable-->
</fieldset>
<br/>
<center>
<form id="frm" action="" method="post">
<input id="configStr" name="configStr" type="hidden">
<input type=button value=预览 onclick="perview()">
<input type=button id=subBut value=提交 >
</form>
</center>
<fieldset style="width:690px;text-align:center;">
<legend>预览</legend>
<div id=perview style=width:690px; >
</div>
</fieldset>
</div>
<script type="text/javascript" >
//自定义函数
var item_Div = "<div class=itemDiv><div class=item-capital ><table><tr><td class=tdTitle><div class=capitalView style=display:none></div><div class=capitalEdit ><input class=titleInput type=text value=标题 /></div></td>";
item_Div += "<td class=tdBtn style=w idth:70%;text-align:right; ><input class=btnAddItem type=button value=添加 onclick=addContent(this) /><input class=btnAddItem type=button value=删除 onclick=deleteItem(this) /></td></tr></table></div></div>";
var item_content = "<div class=item-content><table><tr><td class=tdTitle><div class=capitalView style=display:none></div><div class=capitalEdit ><input class=titleInput type=text value=小标题 /></div></td><td> :</td>";
item_content += "<td class=tdValue><div class=tagView style=display:none ></div><div class=tagEdit ><select class=selectInput value=text><option value=text>文本框</option><option value=select>下拉框</option><option value=textarea>文本域</option><option value=radio>单选按钮</option><option value=checkbox>多选按钮</option></select> <input class=valueInput type=text value=预设值 /><input class=nullable type=checkbox value=nullable>必填</input></div>";
item_content += "</td><td class=tdBtn style=text-align:right; ><input class=btnAddItem type=button value=删除 onclick=deleteContent(this) /></td></tr></table></div>";
function itemPerview(type,value,oDIV){
oDIV.html(getTag(type,value));
}
//组装标签
function getTag(type,value){
var html="";
var htmlOptions="";
switch(type){
case 'text':html="<input type='text' style='width:150px;' value="+value+">";break;
case 'select':
options=value.split(",");
for(var i in options){
htmlOptions+="<option value="+options[i]+" >"+options[i]+"</option>";
}
html+="<select style='width:150px;' >";
html+=htmlOptions;
html+="</select>";
break;
case 'textarea':
html="<textarea style='width:95%;' rows=5>"+value+"</textarea>";
break;
case 'radio':
options=value.split(",");
for(var i in options){
html+="<input type=radio name=r1 checked value="+options[i]+" >"+options[i]+"</input>";
}
break;
case 'checkbox':
options=value.split(",");
for(var i in options){
html+="<input type=checkbox name=cb1 value="+options[i]+" >"+options[i]+"</input>";
}
break;
}
return html;
}
//添加小项
function addContent(obj){
var jobj=$(obj);
var oItemDiv = jobj.closest(".itemDiv");//找到最近的 closest找到顶层最近的
oItemDiv.append(item_content);
}
//删除大项
function deleteItem(obj){
var jobj=$(obj);
var oItemDiv = jobj.closest(".itemDiv");
oItemDiv.attr('className','delete');
oItemDiv.css('display','none');
}
//删除小项
function deleteContent(obj){
var jobj=$(obj);
var oItemDiv = jobj.closest(".item-content");
oItemDiv.attr('className','delete');
oItemDiv.css('display','none');
}
//全局预览
function perview(){
var jsonStr = getJsonData(); //alert(jsonStr);
var oJson = eval(jsonStr);//转化为json对象 //alert(oJson[0].capital);
createFormByJson(oJson);
}
//获取表单全部数据
function getJsonData(){
//json字符串示例:[{capital:'标题',items[{title:'小标题',type:'text',value:'预设值'},{},{}]},{},{}]
var jsonStr = new String("[");
var oItems = $("#sortable").children(".itemDiv");//children找子元素,find找后代
oItems.each(function (index, domEle){
var oItem = $(domEle);
var oCapital = oItem.find(".item-capital");
jsonStr+="{capital:'"+oCapital.find(".titleInput").val()+"',items:[";//写标题,开始一个大项
var oContent = oItem.find(".item-content");
oContent.each(function (index, domEle){
//alert(domEle.find(".titleInput").val());
var jobj = $(domEle);
jsonStr+="{title:'"+jobj.find(".titleInput").val()+"',";//开始写一个小项
jsonStr+="type:'"+jobj.find(".selectInput").val()+"',";
jsonStr+="value:'"+jobj.find(".valueInput").val()+"',";
jsonStr+="nullable:'"+jobj.find(".nullable").attr("checked")+"'},";//写完一个小项
});
if (oContent.length > 0) {
jsonStr = jsonStr.substring(0,jsonStr.length-1);//去掉最后一个逗号
}
jsonStr+="]},";//写完一个大项
});
jsonStr = jsonStr.substring(0,jsonStr.length-1);//去掉最后一个逗号
jsonStr+="]";
return(jsonStr);
}
//创建预览 通过json数据对象创建预览
function createFormByJson(oJson){
var html="";
for(var i in oJson){
html+="<table class=perviewTable cellspacing=1><tr class=perviewCapital><th colspan=100>"+oJson[i].capital+"</th></tr>";
for (var j in oJson[i].items){
//oJson[i].items[j].title oJson[i].items[j].type oJson[i].items[j].value
if (oJson[i].items[j].nullable=='false') {
html+="<tr class=perviewTR><td class=title>"+oJson[i].items[j].title+":</td><td class=tag>"+getTag(oJson[i].items[j].type,oJson[i].items[j].value)+"</td></tr>";
}else{
html+="<tr class=perviewTR><td class=title>*"+oJson[i].items[j].title+":</td><td class=tag>"+getTag(oJson[i].items[j].type,oJson[i].items[j].value)+"</td></tr>";
}
}
html+="</table>";
}
$("#perview").html(html);
//$("#perview").dialog({ modal: true });
}
//事件绑定
$(function() {
//live绑定:应用到所有及新增的
//切换到编辑状态
$(".btnEdit").live('click',function(event){
showEdit(this);
event.stopPropagation();
});
//切换到预览状态
$(".btnSubmit").live('click',function(event){
showSubmit(this);
event.stopPropagation();
});
//添加大项
$("#addItem").click(function(event){
$("#sortable").append(item_Div);
})
//提交表单配置数据
$("#subBut").click(function(event){
$("#configStr").val(getJsonData());
$("#frm").submit();
})
//大项排序
$("#sortable").sortable({opacity: '0.8',axis:'y'});
//$("#sortable").disableSelection();
});
//加载时执行的语句函数
$(function() {
});
</script>
</body>
</html>