统一加上validate验证,可以包括暂存和真实存储,数据暂存的时候,可以调用setRulesByAttr("form","saveValid")方法验证数据合法性后,提交数据至缓存空间,如memcached.
/**
* 重置所有input select之类表单项的验证规则
* 接受若干个参数 参数对应相关表单项的自定义属性名,属性值是可以转换为rule的json字串
* 例如:<input saveValid="{required:true}" validateValid="{required:true,number:true}" " type="text" value="" />
* 在调用时至少要有一个参数 是form的ID
* 另外 如果标签的自定义属性ignoreRules是"true"字串 那么这个标签将不会被验证
*例子:<input name="zinv.alimony" saveValid="{number:true}" validateValid="{number:true,required:true}" value="${fn:escapeXml(zinv.alimony)}" type="text" size="10" />元/月
*调用方式: setRulesByAttr("form","saveValid")或setRulesByAttr("form","validateValid");
*/
function setRulesByAttr(formId){
//传入的第一个元素为表单
var frm = $("#" + arguments[0]);
var e = frm.find("input, select, textarea");
// 遍历每个元素
for(var i = 0; i < e.length; i++){
var je = $(e[i]);
// 是否有时间控件
var onf = je.attr("onfocus");
var hasDate = false;
if(onf != null && onf.toString().indexOf("WdatePicker") >= 0)
hasDate = true;
// 清空验证规则
try{
je.rules("remove");
}catch(exx){
//document.ready里必须加上$('#formId...').validate()
alert("移除对象验证规则错,是否缺少$('#formId...').validate()方法\n" + exx.name + "\n" + exx.message);
continue;
}
//如果只传递了一个formId,那么意思就是说取消所有validate验证规则
if(arguments.length <= 1)
continue;
// 判断对象的ignoreRules,true的话,忽略validate验证规则
var irs = je.attr("ignoreRules");
if(irs != null && $.trim(irs) == "true")
continue;
// 遍历所有属性,如'saveValid'属性,
for(var j=1; j<arguments.length; j++){
// rule的属性名
var a = $.trim(arguments[j]);
// 取出属性值
var asv = je.attr(a);
if(asv != null && $.trim(asv).length > 0){
// 将属性值转为rule json
try{
//将json串转换为json对象.
var jr = eval("(" + asv + ")");
if(hasDate){
// 如果有日历控件 那么强制加上时间验证
jr.dateISO = true;
}
// 增加验证规则,这种增加方式出于validate框架支持
je.rules("add", jr);
}catch(ex){
// 转换出错
alert("无法将“" + asv + "”转换成合法的json");
}
}
}
}
}
这样就避免了大量的js验证代码存在于每个不同的页面中!
:)