_jsonDataGetValue=function(elmt,container){
var format=elmt.attr("format"),type=elmt[0].type;
if(type=="radio"){
return elmt[0].checked ? elmt[0].value : (elmt.attr("uncheckvalue")|| "");
}else if(type=="checkbox"){
var isArray=elmt.attr("isArray");
var split=elmt.attr("split")|| ",";
var values=[];
var chks=container.find("input[name='"+elmt[0].name+"']:checked");
for (var i=0; i < chks.length; i++) {
values.push(chks[i].value);
};
return isArray ? values : values.join(split);
}esle if(format=="date" || format=="datetime"){
}else{
return elmt.val();
}
}
/**
*@param {jqDom} elmt
*@param {String} value
*/
_jsonDataSetValue=function(elmt,value){
var tagName=elmt[0].tagName,type=elmt[0].type;
if(tagName=="LABEL"){
elmt.text(value);
}else if(type=="radio"){
(value==elmt[0].value) ? (elmt[0].checked=true) : elmt.removeAttr("checked");
}else if(type=="checkbox"){
if(value !==null){
var values=(""+value).split(elmt.attr("split") || ",");
for (var i=0; i < values.length; i++) {
if(values[i]==elmt[0].value){
elmt[0].checked=true;
return;
}
};
elmt.removeAttr("checked");
}else{
elmt.removeAttr("checked");
}
}else{
elmt.val(value);
}
}
/**
* 拿到本dom容器中的所有输入元素(:input)的value,根据元素name 生产一个json格式的数据集对象返回。
* 或将一个json格式的数据对象填充或绑定的本dom容器form元素中
* @param {Object} data 需要填充或绑定到本dom容器元素中 的数据
*/
$.fn.jsonData=function(data){
//声明将要用到的变量
var elmtName,elmtValue,elmt,elmts=this.find(":input[name]").toArray();
//判断是否传递了用于填充的数据对象
if(data && typeof data=="object"){
//如果传递了 data参数,则将data中的数据绑定到容器中的form元素中
elmts=elmts.concat(this.find("label[name]").toArray());
for(var i=0;i<elmts.length;i++){
elmt=$(elmts[i]);
elmtName=elmt.attr("name");
//根据elmtName取出data中相对应得数据
try{elmtValue=eval("data."+elmtName);}catch(e){}
if(typeof elmtValue!="undefined"){
_jsonDataSetValue(elmt,elmtValue);
}
}
return this;
}else{
//如果没有任何参数,则需取出容器中的输入元素值,根据其name封装成对象返回
//用户缓存已经 设置或读取过的 name 属性,(相同name元素在同一次jsonData操作中的不会读取第二次)
var currObj={};
var cache={};
for(var i=0;i<elmts.length;i++){
elmt=$(elmts[i]);
elmtName=elmt.attr("name");
if(cache[elmtName]){
//如果该同名元素已经读取过,将跳过该元素
continue;
}
var attrs=elmtName.match(/[a-zA-Z0-9_]+/g);
for (var j=1; j < attrs.length-1; j++) {
if(typeof currObj[attrs[j-1]]!="object"){
if(isNaN(attrs[j])){
currObj=currObj[attrs[j-1]]=currObj[attrs[j-1]] || {};
}else{
currObj=currObj[attrs[j-1]]=currObj[attrs[j-1]] || [];
}
}
};
var lastAttr=attrs[attrs.length-1];
if(!isNaN(lastAttr)){
lastAttr=parseInt(lastAttr);
}
currObj[lastAttr]=_jsonDataGetValue(elmt,this);
//读取后,缓存该名称,下次同名元素将不再读取,直接跳过
cache[elmtName]=true;
}
return currObj;
}
}