//获取表单数据,返回json格式数据
/*
*因为项目涉及到大量的表单处理,字段一一对应会比较繁琐,所以写了个方法统一获取需要提交的表单元素
*公司用的easyui框架,所以对easyui表单元素有做相应处理,如不需要可以删除函数里面的if判断,只取else里面的内容即可
*思路:
*表单的字段id="数据库字段名 + _auto";
*radio和checkbox则是name="数据库字段名 + _auto";
*函数会遍历表单里面的所有最后有_auto的id或name,自动读取值到data,最后返回json格式数据
*调用方法:_getAutoObject('#form1');
*/
//null或undefined字段返回空字符串
function nullToSpace (v) {
return !v && v != '0' ? '' : v;
}
//替代eval的函数
function evil (fn) {
var Fn = Function; //一个变量指向Function,防止有些前端编译工具报错
return new Fn('return ' + fn)();
}
function _getAutoObject(obj) {
var data = {};
obj = obj || 'body';
// 找到元素,进行循环
$(obj).find('*[id$=_auto],*[name$=_auto]').each(function () {
var $t = $(this),
$t_id = $t.attr('id'),
$t_name = $t.attr('name'),
$t_class = $t.attr('class'),
$key;
if ($t.attr('type') != 'radio' && $t.attr('type') != 'checkbox') {
$key = $t_id;
} else {
$key = $t_name;
}
$key = $key.substring(0, $key.length - 5);
//判断是否easyui表单组件
if ($t_class && ($t_class.indexOf('combo-f') != '-1' || $t_class.indexOf('textbox-f') != '-1' || $t_class.indexOf('numberbox-f') != '-1' || $t_class.indexOf('validatebox-f') != '-1' || $t_class.indexOf('datebox-f') != '-1' || $t_class.indexOf('datetimebox-f') != '-1' || $t_class.indexOf('datetimespinner-f') != '-1' || $t_class.indexOf('numberspinner-f') != '-1')) {
var c = $t_class.split('-f')[0].split(' '),
isVals = '$("'+ obj +' #' + $key + '_auto").' + c + '("options").multiple',
v = 'getValue';
c = c[c.length - 1];
if (c.indexOf('combo') != -1) {
try {
if (evil(isVals)) {
v = 'getValues';
}
} catch (e) {
}
}
var func = '$("'+ obj +' #' + $key + '_auto").' + c + '("' + v + '")';
try {
data[$key] = evil(func);
} catch (e) {
}
} else {
//普通表单元素
if ($t.is('span') || $t.is('div') || $t.is('a') || $t.is('p')) {
data[$key] = $t.text();
} else if ($t.is('img')) {
data[$key] = $t.attr('src');
} else if ($t.is(':input')) {
if ($t.attr('type') == 'checkbox') {
data[$key] = 0;
var c = '*[type="checkbox"][name="' + $key + '_auto"]',
$val;
if ($(c).length > 1) {
$val = [];
$(c).each(function (i) {
if ($(c).eq(i).is(':checked')) {
$val.push($(c).eq(i).val());
}
});
} else {
if ($t.is(':checked')) {
if ($val == '' || $val == null || $val == 'on') {
$val = 1;
}
} else {// 没有选中
$val = 0
}
}
data[$key] = $val;
} else if ($t.attr('type') == 'radio') {
data[$key] = '';
var c = '*[type="radio"][name="' + $key + '_auto"]:checked';
if ($(c).length > 0) {
data[$key] = $(c).val();
}
} else {
data[$key] = $t.val();
}
}
}
});
return data;
}
//与上面相对应的,还有一个自动填充表单数据函数_showFormContent,思路差不多,只是略微复杂一点
/*html例如:
<style>
.f-dn{
display: none;
}
</style>
<form id="form">
<input id="test_id_auto" type="hidden" value="1111111">
<div>
<div class="uname_auto"></div><!-- 数据库字段名 + _auto 结尾的class不会提交,用于显示默认字段内容 -->
<div class="sex_auto"></div>
<div class="textarea_auto"></div>
</div>
<table class="m-table">
<tbody>
<tr>
<td align="right" valign="top">姓名: </td>
<td valign="top">
<input id="uname_auto" type="text">
<span class="uname_ori f-dn"></span>
</td>
<td align="right" valign="top">性别: </td>
<td valign="top">
<select id="sex_auto">
<option value="">-请选择-</option>
<option value="1">男</option>
<option value="2">女</option>
</select>
<span class="sex_ori f-dn"></span>
</td>
</tr>
<tr>
<td align="right" valign="top">自我介绍: </td>
<td valign="top" colspan="3">
<textarea id="textarea_auto"></textarea>
<span class="textarea_ori f-dn"></span>
</td>
</tr>
</tbody>
</table>
</form>
*参数解析:
*data为json格式数据,函数会根据json匹配字段值到相应的元素
*operType有以下几种值:
edit 编辑状态 数据填充到id="数据库字段名 + _auto"元素,表单仍可编辑
detail 详情状态 数据填充到class="数据库字段名 + _ori"元素并显示,会自动移除相邻的表单元素,不能恢复编辑
detail2 详情状态 数据填充到class="数据库字段名 + _ori"元素并显示,会自动隐藏相邻的表单元素,可以与edit状态互相切换
clear 清除状态 将data数据里对应的字段值清空,select筛选时用到
*调用方法:
_showFormContent(data,'edit','#form1'); //如果页面只有一个表单需要填充,第三个参数可以不填,默认为body
_showFormContent(data,'detail','#form2');
_showFormContent(data,'detail2','#form3');
_showFormContent(data,'clear','#form4');
*/
function _showFormContent(data, operType, obj) {
obj = obj || 'body';
//初始化表单元素
if (operType != 'clear') {
var $t = $(obj).find('*[id$=_auto],*[name$=_auto]');
$(obj).find(':input').removeAttr('disabled');
$t.each(function (i) {
var $t_class = $t.eq(i).attr('class'),
$t_id = $t.eq(i).attr('id');
$t_id = $t_id.substring(0, $t_id.length - 5);
//判断是否easyui表单组件
if ($t_class && ($t_class.indexOf('combo-f') != '-1' || $t_class.indexOf('textbox-f') != '-1' || $t_class.indexOf('numberbox-f') != '-1' || $t_class.indexOf('validatebox-f') != '-1' || $t_class.indexOf('datebox-f') != '-1' || $t_class.indexOf('datetimebox-f') != '-1' || $t_class.indexOf('datetimespinner-f') != '-1' || $t_class.indexOf('numberspinner-f') != '-1')) {
var t_c = $t_class.split('-f')[0].split(' '),
t_v = 'setValue';
t_c = t_c[t_c.length - 1];
try {
evil('$("' + obj + '").find("#' + $t_id + '_auto").' + t_c + '("' + t_v + '","")');
} catch (e) {
}
if (operType == 'detail' || operType == 'print' || operType == 'detail2') {
$(obj).find('.' + $t_id + '_ori').show();
$t.eq(i).next('span').hide();
} else {
$(obj).find('.' + $t_id + '_ori').hide();
$t.eq(i).next('span').show();
}
} else {
if ($t.eq(i).is(':input')) {
$t.eq(i).val('');
} else {
$t.eq(i).html('');
}
$(obj).find('.' + $t_id + '_ori').html('');
if (operType == 'detail' || operType == 'print' || operType == 'detail2') {
$(obj).find(':input').attr('disabled', 'disabled');
if ($t.eq(i).attr('type') != 'hidden') {
$(obj).find('.' + $t_id + '_ori').show().siblings().hide();
}
if (operType != 'detail2') {
$(obj).find('.' + $t_id + '_ori').siblings().remove();
}
} else {
$(obj).find(':input').removeAttr('disabled');
if ($t.eq(i).attr('type') != 'hidden') {
$(obj).find('.' + $t_id + '_ori').hide().siblings().show();
}
}
}
});
var showDetail = function (id, value) {
if (operType == 'detail' || operType == 'print' || operType == 'detail2') {
$(obj).find(id).html(value);
}
};
}
//填充数据
if (nullToSpace(data) != '') {
$.each(data, function (n, value) {
if (operType == 'clear') {
value = '';
}
var _id = '#' + n + '_auto', //表单需要提交的字段id
_name = 'input[name="' + n + '_auto"]',
_s_id = '.' + n + '_auto', //新增和编辑时需要默认显示的字段
_ori_id = '.' + n + '_ori', //详情和打印时显示的字段
$class = $(obj).find(_id).attr('class'),
$type = $(obj).find(_id).attr('type');
if ($(obj).find(_id).length > 0 || $(obj).find(_name).length > 0 || $(obj).find(_s_id).length > 0 || $(obj).find(_ori_id).length > 0) {
if (typeof value == 'string') {
if (value.indexOf('\r') != '-1' || value.indexOf('\n') != '-1' || value.indexOf('<w:br/>') != '-1') {
if (operType == 'detail' || operType == 'print') {
//详情换行转换
value = value.replace(/(\r\n|\n|\r|<w:br\/>)/gm, '<br>');
} else {
if ($(obj).find(_id).is('textarea')) {
//后台返回的数据如果有换行符时easyui表单控件会出现bug,需要转化换行符再执行函数
value = value.replace(/(\r\n|\n|\r|<w:br\/>)/gm, '\r\n');
}
}
}
}
value = nullToSpace(value);
//判断是否easyui表单元素
if ($(obj).find(_id).length > 0 && $class && ($class.indexOf('combo-f') != '-1' || $class.indexOf('textbox-f') != '-1' || $class.indexOf('numberbox-f') != '-1' || $class.indexOf('validatebox-f') != '-1' || $class.indexOf('datebox-f') != '-1' || $class.indexOf('datetimebox-f') != '-1' || $class.indexOf('datetimespinner-f') != '-1' || $class.indexOf('numberspinner-f') != '-1')) {
var c = $class.split('-f')[0].split(' '),
v = 'setValue';
c = c[c.length - 1];
var func = '';
if (c.indexOf('combo') != -1 && String(value).length > 1) {
try {
if (typeof evil(value) == 'object') {
v = 'setValues';
}
} catch (e) {
}
}
func = '$("' + obj + '").find("#' + n + '_auto" ).' + c + '("' + v + '","' + value + '")';
evil(func);
if ($class.indexOf('combo-f') != '-1') {
var $text = $(obj).find(_id).combo('getText');
$(obj).find(_s_id).html($text);
showDetail(_ori_id, $text);
} else {
$(obj).find(_s_id).html(value);
showDetail(_ori_id, value);
}
} else {
$(obj).find(_s_id).html(value);
//普通表单元素
if ($(obj).find(_name).length > 0) {
$(obj).find(_name).removeAttr('checked');//初始清空样式
if ($(obj).find(_name).attr('type') == 'checkbox') {
if (typeof value != 'object') {
if (value == '1') {
$(obj).find(_name).attr("checked", true).prop('checked', true);
}
} else {
var v = '';
$.each(value, function (a, k) {
$(obj).find(_name + '[value="' + k + '"]').attr("checked", true).prop('checked', true);
if (a == 0) {
v += k;
} else {
v += ',' + k;
}
});
$(obj).find(_s_id).html(v);
showDetail(_ori_id, v);
}
} else if ($(obj).find(_name).attr('type') == 'radio') {
if (value != '' || value == '0') {
$(obj).find(_name + '[value="' + value + '"]').attr("checked", true).prop('checked', true);
$(obj).find(_s_id).html(value);
showDetail(_ori_id, value);
}
}
} else {
if ($(obj).find(_id).is(':input')) {
$(obj).find(_id).val(value);
} else if ($(obj).find(_id).is('img') && value != '') {
$(obj).find(_id).attr('src', value).show().siblings().hide();
} else {
$(obj).find(_id).html(value);
}
showDetail(_ori_id, value);
}
}
}
});
}
}