必要的工具函数:
var _$ = function(n, w) {
return typeof n == "string" ? (w || window).document.getElementById(n) : n;
}; var _ergodicElement = function(n, f, w) {
var e = _$(n, w);
if(e.nodeType == 1 && !e.getAttribute("noergodic")) {
f(e);
}
for(var n = e.firstChild; n; n = n.nextSibling) {
_ergodicElement(n, f, w);
}
}; var _attachEvent = function(n, e, w) {
if(document.addEventListener) {
for(var i in e) {
_$(n, w).addEventListener(i, e[i], false);
}
} else if(document.attachEvent) {
for(var i in e) {
_$(n, w).attachEvent("on" + i, e[i]);
}
}
}; var _detachEvent = function(n, e, w) {
if(document.removeEventListener) {
for(var i in e) {
_$(n, w).removeEventListener(i, e[i], false);
}
} else if(document.detachEvent) {
for(var i in e) {
_$(n, w).detachEvent("on" + i, e[i]);
}
}
}; var _rewriteAccess = function(a, f) {
if(a.constructor == String) {
var d = {};
var r = /(\w+?)(?:=)([^\s;]+)/g;
while(r.exec(a)) {
d[RegExp.$1] = f && f[RegExp.$1] ? f[RegExp.$1](decodeURIComponent(RegExp.$2)) : decodeURIComponent(RegExp.$2);
}
return d;
}
if(a.constructor == Object) {
var d = "";
for(var i in a) {
d += i + "=" + encodeURIComponent(f && f[i] ? f[i](a[i]) : a[i]) + "; ";
}
return d;
}
}; var _rewriteObject = function(a, b) {
for(var i in b) {
if(!a[i]) {
a[i] = b[i];
}
}
};
var _$ = function(n, w) {
return typeof n == "string" ? (w || window).document.getElementById(n) : n;
}; var _ergodicElement = function(n, f, w) {
var e = _$(n, w);
if(e.nodeType == 1 && !e.getAttribute("noergodic")) {
f(e);
}
for(var n = e.firstChild; n; n = n.nextSibling) {
_ergodicElement(n, f, w);
}
}; var _attachEvent = function(n, e, w) {
if(document.addEventListener) {
for(var i in e) {
_$(n, w).addEventListener(i, e[i], false);
}
} else if(document.attachEvent) {
for(var i in e) {
_$(n, w).attachEvent("on" + i, e[i]);
}
}
}; var _detachEvent = function(n, e, w) {
if(document.removeEventListener) {
for(var i in e) {
_$(n, w).removeEventListener(i, e[i], false);
}
} else if(document.detachEvent) {
for(var i in e) {
_$(n, w).detachEvent("on" + i, e[i]);
}
}
}; var _rewriteAccess = function(a, f) {
if(a.constructor == String) {
var d = {};
var r = /(\w+?)(?:=)([^\s;]+)/g;
while(r.exec(a)) {
d[RegExp.$1] = f && f[RegExp.$1] ? f[RegExp.$1](decodeURIComponent(RegExp.$2)) : decodeURIComponent(RegExp.$2);
}
return d;
}
if(a.constructor == Object) {
var d = "";
for(var i in a) {
d += i + "=" + encodeURIComponent(f && f[i] ? f[i](a[i]) : a[i]) + "; ";
}
return d;
}
}; var _rewriteObject = function(a, b) {
for(var i in b) {
if(!a[i]) {
a[i] = b[i];
}
}
};
(function() {
//函数盒子
var _bin = function(form, request) {
try {
//定义验证队列
var verifyArray = []; //定义验证函数
var verify = function(t) {
if(/checkbox|radio/i.test(t.type)) { //定义对比队列
t = t.name ? document.getElementsByName(t.name) : {0 : t, length : 1}; //执行对比队列
for(var i = 0; i < t.length; i++) {
if(t[i].checked) {
t[0].verifyStatus = "right";
break;
}
if(i == t.length - 1) {
t[0].verifyStatus = "empty";
}
} //执行描述函数
return depict(t[0]); } else { //定义对比参数
var v = t.value;
var r = t.getAttribute("regexp");
var e = t.getAttribute("equate");
var m = t.getAttribute("method"); //清除对比参数
t.removeAttribute("depictmethod"); //执行对比参数
if(!v) {
t.getAttribute("nullable") ? t.verifyStatus = "blank" : t.verifyStatus = "empty";
} else if(r && (v.search(r) < 0)) {
t.verifyStatus = "error";
} else if(e && (v != _$(e).value)) {
t.verifyStatus = "error";
} else if(m && (m = request[m](v, t))) {
t.verifyStatus = "error";
t.setAttribute("depictmethod", m);
} else {
t.verifyStatus = "right";
} //执行描述函数
return depict(t); }
}; //定义描述函数
var depict = function(t) { //定义描述参数
var s = t.verifyStatus;
var d = t.getAttribute("depictmethod") || _rewriteAccess(t.getAttribute("depict") || "")[s] || ""; //定义描述节点
if(t.depictNode === undefined) {
t.depictNode = null;
if(t.getAttribute("for")) {
t.depictNode = _$(t.getAttribute("for"));
} else {
_ergodicElement(t.parentNode, function(e) {
if(e.getAttribute("depictnode") && e.getAttribute("depictnode") == "depictnode") {
t.depictNode = e;
return;
}
});
}
} //执行描述
if(t.depictNode) {
if(!t.depictNodeInner) {
t.depictNodeInner = t.depictNode.innerHTML;
}
t.depictNode.innerHTML = "<span class=\"" + s + "\">" + d + "<\/span>";
} else if(/input|empty|error/i.test(s)) {
return d;
} }; //定义提交函数
var submit = function() { //定义提交参数
var m = [];
var c = 0; //执行对比队列
for(var i = 0; i < verifyArray.length; i++) {
if(/checkbox|radio/i.test(verifyArray[i].type) && verifyArray[i].name && document.getElementsByName(verifyArray[i].name)[0] != verifyArray[i]) {
continue;
}
if(d = verify(verifyArray[i])) {
m.push(d);
}
if(/input|empty|error/i.test(verifyArray[i].verifyStatus)) {
c++;
}
} //执行提交校对
if(request["submit"]) {
if(d = request["submit"](verifyArray, c)) {
m.push(d);
c++;
}
} //执行描述函数
if(c) {
alert("您提交的表单中有 " + c + " 处错误,请更正后再提交!" + (m.length ? "\n\n您可能需要确认以下内容:\n\n※ " + m.join("\n※ ") : ""));
} //返回对比结果
return c; }; //定义锁定函数
var locked = function() {
for(var i = 0; i < verifyArray.length; i++) {
try {
verifyArray[i].setAttribute("readonly", "readonly", 0);
} catch(error) {
continue;
}
}
}; //定义行为函数
var action = function() {
var a = arguments[0].toLowerCase();
var e = _$(arguments[1]); switch(a) { //覆载
case "afresh" : {
_ergodicElement(form, function(e) {
action("append", e);
});
break;
} //撤消
case "repeal" : {
_ergodicElement(form, function(e) {
action("remove", e);
});
break;
} //附加
case "append" : {
if(!e.verifyReady) {
if(/text|testarea|password|hidden/i.test(e.type || e.tagName) && (e.getAttribute("regexp") || e.getAttribute("equate") || e.getAttribute("method"))) { //定义事件函数
if(!e.verifyFocus) {
e.verifyFocus = function() {
if(/blank|empty|undefined/i.test(e.verifyStatus)) {
e.verifyStatus = "input";
}
depict(e);
};
e.verifyBlur = function() {
verify(e);
};
} //注册事件函数
_attachEvent(e, {
"focus" : e.verifyFocus,
"blur" : e.verifyBlur
}); //注册验证对象
verifyArray.push(e); //设置验证标记
e.verifyReady = "complete"; } else if(/select/i.test(e.tagName) && (e.getAttribute("regexp") || e.getAttribute("equate") || e.getAttribute("method"))) { //定义事件函数
if(!e.verifyChange) {
e.verifyChange = function() {
verify(e);
};
} //注册事件函数
_attachEvent(e, {
"change" : e.verifyChange
}); //注册验证对象
verifyArray.push(e); //设置验证标记
e.verifyReady = "complete"; } else if(/checkbox|radio/i.test(e.type) && !e.getAttribute("nullable")) { //定义事件函数
if(!e.verifyClick) {
e.verifyClick = function() {
verify(e);
};
} //注册事件函数
_attachEvent(e, {
"click" : e.verifyClick
}); //注册验证对象
verifyArray.push(e); //设置验证标记
e.verifyReady = "complete"; } else if(e.getAttribute("request")) { //定义事件函数
if(!e.verifyClick) {
e.verifyClick = function() {
request[e.getAttribute("request")]();
};
} //注册事件函数
_attachEvent(e, {
"click" : e.verifyClick
}); //设置验证标记
e.verifyReady = "complete"; }
}
break;
}
//移除
case "remove" : {
if(e.verifyReady) {
if(/text|testarea|password|hidden/i.test(e.type || e.tagName) && (e.getAttribute("regexp") || e.getAttribute("equate") || e.getAttribute("method"))) { //分离描述内容
if(e.depictNodeInner) {
e.depictNode.innerHTML = e.depictNodeInner;
} //分离事件函数
_detachEvent(e, {
"focus" : e.verifyFocus,
"blur" : e.verifyBlur
}); //分离验证对象
for(var i in verifyArray) {
if(verifyArray[i] == e) {
verifyArray.splice(i, 1);
}
} //删除验证标记
delete e.verifyReady; } else if(/select/i.test(e.tagName) && (e.getAttribute("regexp") || e.getAttribute("equate") || e.getAttribute("method"))) { //分离描述内容
if(e.depictNodeInner) {
e.depictNode.innerHTML = e.depictNodeInner;
} //分离事件函数
_detachEvent(e, {
"change" : e.verifyChange
}); //分离验证对象
for(var i in verifyArray) {
if(verifyArray[i] == e) {
verifyArray.splice(i, 1);
}
} //删除验证标记
delete e.verifyReady; } else if(/checkbox|radio/i.test(e.type) && !e.getAttribute("nullable")) { //分离描述内容
if(e.depictNodeInner) {
e.depictNode.innerHTML = e.depictNodeInner;
} //分离事件函数
_detachEvent(e, {
"click" : e.verifyClick
}); //分离验证对象
for(var i in verifyArray) {
if(verifyArray[i] == e) {
verifyArray.splice(i, 1);
}
} //删除验证标记
delete e.verifyReady; } else if(e.getAttribute("request")) { //分离事件函数
_detachEvent(e, {
"click" : e.verifyClick
}); //删除验证标记
delete e.verifyReady; }
}
break;
} }
}; //初始化表单
form = _$(form);
form.setAttribute("onsubmit", "return false", 0); //初始化请求
request = request || {};
_rewriteObject(request, {
"onsubmit" : function() {
if(!submit() && !locked()) {
submit = null;
form.submit();
}
},
"onreset" : function() {
if(confirm("重置操作将清空信息,确认重置?")) {
form.reset();
for(var i = 0; i < verifyArray.length; i++) {
if(verifyArray[i].depictNode) {
verifyArray[i].depictNode.innerHTML = verifyArray[i].depictNodeInner;
}
}
}
},
"onsaveas" : function() {
if(!submit() && confirm("保存操作将更新信息,确认保存?") && !locked()) {
submit = null;
form.submit();
}
},
"oncancel" : function() {
throw new Error("Developing...");
}
}); //初始化行为
action("afresh"); return function() {action(arguments[0], arguments[1])};
} catch(error) { }
}; //添加全局引用
verify = _bin;
})();
说明 + 演示地址:http://www.izhaoyang.com/temp/index.htm