後經過一段對Jquery的學習,Jquery的強大解決了輔助代碼過多不易維護的問題。
AutoValidate.JS
代碼如下:
/// <reference path="../Scripts/jquery-1.4.1-vsdoc.js" />
//驗證方法 v1.0,創建於2010-12-9 完成2010-12-16 MR.X 制
//修改2010-12-10、2010-12-12、2010-12-15、2010-12-16添入信息提示動畫效果
//支持 type=text type=checkbox type=radio select 標簽驗證
//vld="***"必填 格式驗證
//vld="n***"選填 格式驗證
//err="***"錯誤顯示內容
//super="y"用<span>追加提示信息,要用y以外字母得修改同級一組驗證,同級一組的標簽可以在第一個標簽進行super="y"屬性標識,其它不用
//len="***"長度限制,用於textarea標簽
//<input id="***" type="text" vld="***" err="***" span="***" len="***"/>
$(function () {
//正則匿名對象
var strRegex = {};
//錯誤信息匿名對象
var strError = {};
//正確信息匿名對象
var strRight = {};
/** 參數配置 start **/
//非空
strRegex.NoNull = /[^\s]+/;
strError.NoNull = "請填寫內容,如123、中國!";
//郵箱
strRegex.Email = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/;
strError.Email = "請核對郵箱格式,如china@163.com!";
//網址
strRegex.Url = /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^\"\"])*$/;
strError.Url = "請核對網址格式,如http://www.poluoluo.com!";
//賬號
strRegex.An = /^([a-zA-Z0-9]|[_]){6,16}$/;
strError.An = "請核對賬號格式,如china_56!";
//數字
strRegex.Math = /\d+$/;
strError.Math = "請核對數字格式,如1234!";
//年齡
strRegex.Age = /^\d{2}$/;
strError.Age = "請核對年齡格式,10~99歲之間!";
//郵編
strRegex.Post = /^[1-9]\d{5}$/;
strError.Post = "請核對郵編格式,如150001!";
//電話
strRegex.Phone = /^((\d{11})|((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})))$/;
strError.Phone = "請核對電話格式,如15546503251!";
//身份證
strRegex.Card = /^(([1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[X,x]))|([1-9]\d{5}[1-9]\d{1}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])(\d{3})))$/;
strError.Card = "請核對身份證格式,如230103190001010000!";
//金錢
strRegex.Price = /^([1-9]\d*|0)(\.\d+)?$/;
strError.Price = "請核對金錢格式,如99.98!";
//日期
strRegex.Date = /((^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(10|12|0?[13578])([-\/\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(11|0?[469])([-\/\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))([-\/\._])(0?2)([-\/\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([3579][26]00)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][2468][048])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))/;
strError.Date = "請核對日期格式,如1999.9.9、1999-9-9、1999.09.09!";
//時間
strRegex.Time = /^([0-9]|[0-1][0-9]|[2][0-3])(:|:)([0-5][0-9])$/;
strError.Time = "請核對時間格式,如23:59!";
strError.Length = "請核對輸入信息長度,長度小於";
strRight.Info = "格式正確!"; //可以設置為空
//下拉框
strRegex.DDL = "請選擇";
strError.DDL = "請選擇選項";
//單個checkbox復選框
strRegex.Check = "請選擇";
strError.Check = "請選擇選項";
//單個radio復選框
strRegex.Radio = "請選擇";
strError.Radio = "請選擇選項";
//同級一組checkbox復選框
strRegex.CheckGroup = "請選擇";
strError.CheckGroup = "請選擇選項";
//同級一組radio復選框
strRegex.RadioGroup = "請選擇";
strError.RadioGroup = "請選擇選項";
//在標簽後面追加信息
var SpanError = "<span class='vldSpanErr'><img src='" + FilePath() + "images/error.gif' /></span>";
var SpanOk = "<span class='vldSpanRig'><img src='" + FilePath() + "images/ok.gif' /></span>";
/** 參數配置 end **/
/** Main **/
//文件目錄,回返最頂級目錄 ../
function FilePath() {
var file = "";
var path = window.location.pathname.split('/');
$(path).each(function () {
file = "../" + file;
});
return file;
}
//頁驗證自檢
$("#form1 [vld]").blur(function () {
RegexGether($(this));
});
//驗證處理集合
function RegexGether($ctrl) {
switch ($ctrl.attr("vld")) {
case "nonull":
RegexNull($ctrl);
break;
case "age":
RegexInputTextAll($ctrl, strRegex.Age, strError.Age);
break;
case "nage":
RegexInputTextOnly($ctrl, strRegex.Age, strError.Age);
break;
case "date":
RegexInputTextAll($ctrl, strRegex.Date, strError.Date);
break;
case "ndate":
RegexInputTextOnly($ctrl, strRegex.Date, strError.Date);
break;
case "price":
RegexInputTextAll($ctrl, strRegex.Price, strError.Price);
break;
case "nprice":
RegexInputTextOnly($ctrl, strRegex.Price, strError.Price);
break;
case "email":
RegexInputTextAll($ctrl, strRegex.Email, strError.Email);
break;
case "nemail":
RegexInputTextOnly($ctrl, strRegex.Email, strError.Email);
break;
case "post":
RegexInputTextAll($ctrl, strRegex.Post, strError.Post);
break;
case "npost":
RegexInputTextOnly($ctrl, strRegex.Post, strError.Post);
break;
case "card":
RegexInputTextAll($ctrl, strRegex.Card, strError.Card);
break;
case "ncard":
RegexInputTextOnly($ctrl, strRegex.Card, strError.Card);
break;
case "time":
RegexInputTextAll($ctrl, strRegex.Time, strError.Time);
break;
case "ntime":
RegexInputTextOnly($ctrl, strRegex.Time, strError.Time);
break;
case "math":
RegexInputTextAll($ctrl, strRegex.Math, strError.Math);
break;
case "nmath":
RegexInputTextOnly($ctrl, strRegex.Math, strError.Math);
break;
case "url":
RegexInputTextAll($ctrl, strRegex.Url, strError.Url);
break;
case "nurl":
RegexInputTextOnly($ctrl, strRegex.Url, strError.Url);
break;
case "an":
RegexInputTextAll($ctrl, strRegex.An, strError.An);
break;
case "nan":
RegexInputTextOnly($ctrl, strRegex.An, strError.An);
break;
case "phone":
RegexInputTextAll($ctrl, strRegex.Phone, strError.Phone);
break;
case "nphone":
RegexInputTextOnly($ctrl, strRegex.Phone, strError.Phone);
break;
case "ddl":
RegexSelect($ctrl);
break;
case "check":
RegexInputCheckBoxRadioOnly($ctrl, strError.Check);
break;
case "radio":
RegexInputCheckBoxRadioOnly($ctrl, strError.Radio);
break;
case "checkgroup":
RegexInputCheckBoxRadioAll($ctrl, strError.CheckGroup);
break;
case "radiogroup":
RegexInputCheckBoxRadioAll($ctrl, strError.RadioGroup);
break;
}
}
//標簽內容空驗證
function RegexNull($ctrl) {
if (strRegex.NoNull.test($ctrl.val())) {
return RegexLen($ctrl);
}
else {
Error($ctrl, strError.NoNull);
return false;
}
}
//驗證多個同級一組input(type=radio)標簽 或 input(type=checkbox)標簽
function RegexInputCheckBoxRadioAll($ctrl, error) {
if ($ctrl.parent().children(":checked").length == 0) {
if ($ctrl.parent().children().attr("super")) {
//同級標簽中可能會有多個[super='y']存在,只取一個,用return false;控制,執行一次就從循環體中跳出
$ctrl.parent().children("[super='y']").each(function () {
Error($(this), error);
return false;
});
}
else {
//同級一組標簽一起報錯
$ctrl.parent().children("[type='" + $ctrl.attr("type") + "']").each(function () {
Error($(this), error);
});
}
return false;
}
else {
if ($ctrl.parent().children().attr("super")) {
$ctrl.parent().children("[super='y']").each(function () {
Ok($(this));
return false;
});
}
else {
$ctrl.parent().children().each(function () {
Ok($(this));
});
}
return true;
}
}
//驗證單個input(type=radio)標簽 或 input(type=checkbox)標簽
function RegexInputCheckBoxRadioOnly($ctrl, error) {
if (!$ctrl.attr("checked")) {
Error($ctrl, error);
return false;
}
else {
Ok($ctrl);
return true;
}
}
//select標簽,選項驗證
function RegexSelect($ctrl) {
if ($ctrl.val() == strRegex.DDL) {
Error($ctrl, strError.DDL);
return false;
}
else {
Ok($ctrl);
return true;
}
}
//標簽允許為空內容格式驗證,type=text標簽驗證
function RegexInputTextOnly($ctrl, Regex, error) {
//先驗證標簽是否為空
if (strRegex.NoNull.test($ctrl.val())) {
return RegexOtherFormat($ctrl, Regex, error);
}
else {
Ok($ctrl);
return true;
}
}
//標簽不允許為空內容格式驗證,type=text標簽驗證
function RegexInputTextAll($ctrl, Regex, error) {
//先驗證標簽是否為空
if (strRegex.NoNull.test($ctrl.val())) {
return RegexOtherFormat($ctrl, Regex, error);
}
else {
Error($ctrl, error);
return false;
}
}
//標簽內容格式驗證
function RegexOtherFormat($ctrl, Regex, error) {
if (Regex.test($ctrl.val())) {
return RegexLen($ctrl);
}
else {
Error($ctrl, error);
return false;
}
}
//textarea標簽長度驗證
function RegexLen($ctrl) {
//標簽中是否有len屬性
if ($ctrl.attr("len")) {
var error = strError.Length + $ctrl.attr("len") + "字!";
if (parseInt($ctrl.val().length) > parseInt($ctrl.attr("len"))) {
Error($ctrl, error);
return false;
}
}
Ok($ctrl);
return true;
}
//格式驗證錯誤顯示
function Error($ctrl, error) {
//標簽中有err屬性,根據屬性內容填入title中
if ($ctrl.attr("err")) {
error = $ctrl.attr("err");
}
if ($ctrl.attr("super")) {
//具有super屬性標簽追加span
$ctrl.parent().find("span").remove();
$ctrl.parent().append(SpanError);
$ctrl.parent().find("span").append(error);
$ctrl.parent().find("span").fadeTo("slow", 0.66);
}
else {
//追加到title屬性中
$ctrl.attr("title", error);
$ctrl.addClass("error");
}
}
//格式驗證無誤,清除錯誤樣式
function Ok($ctrl) {
//去除可以存在的錯誤樣式
if ($ctrl.attr("super")) {
$ctrl.parent().find("span").remove();
}
else {
$ctrl.removeClass("error");
}
if ($.trim($ctrl.val()).length > 0) {
var right = strRight.Info;
//檢查標簽中是否有rig屬性
if ($ctrl.attr("rig")) {
right = $ctrl.attr("rig");
}
//添加正確提示信息
if ($ctrl.attr("super")) {
$ctrl.parent().append(SpanOk);
$ctrl.parent().find("span").append(right);
$ctrl.parent().find("span").fadeTo("slow",0.99).fadeTo("slow",0.99).fadeTo("slow",0);
}
else {
$ctrl.attr("title", right);
}
}
}
//提交自檢
$("#vldBtn").click(function () {
$("#form1 [vld]").each(function () {
RegexGether($(this));
});
//檢查標簽中樣式是否有error
if ($("#form1 [vld][class='error']").length > 0) {
return false;
}
else {
return true;
}
});
});
AutoValidate.htm
代碼如下:
<!DOCTYPE html PUBLIC "-//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></title>
<link href="Css/style01.css" rel="stylesheet" type="text/css" />
<link href="Css/AutoValidate.css" rel="stylesheet" type="text/css" />
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script src="Scripts/Jquery.timer.js" type="text/javascript"></script>
<script src="Js/style.js" type="text/javascript"></script>
<script src="Js/AutoValidate.js" type="text/javascript"></script>
</head>
<body>
<form id="form1">
<ul class="tab_ul">
<li>
<p>姓名:</p>
<p><input id="name" type="text" vld="nonull" err="okokok!!!" super="y" rig="格式蜚蜚蜚暃蜚暃暃蜚暃暃蜚暃昦" /></p>
</li>
<li>
<p>年齡:</p>
<p><input id="age" type="text" vld="age" /></p>
</li>
<li>
<p>日期:</p>
<p><input id="date" type="text" vld="ndate" /></p>
</li>
<li>
<p>金錢:</p>
<p><input id="price" type="text" vld="nprice" /></p>
</li>
<li>
<p>郵箱:</p>
<p><input id="email" type="text" vld="email" /></p>
</li>
<li>
<p>郵編:</p>
<p><input id="post" type="text" vld="post" /></p>
</li>
<li>
<p>電話:</p>
<p><input id="phone" type="text" vld="phone" len="10" /></p>
</li>
<li>
<p>身份證:</p>
<p><input id="card" type="text" vld="card" /></p>
</li>
<li>
<p>時間:</p>
<p><input id="time" type="text" vld="ntime" /></p>
</li>
<li>
<p>數字:</p>
<p><input id="math" type="text" vld="nmath" /></p>
</li>
<li>
<p>網址:</p>
<p><input id="url" type="text" vld="url" /></p>
</li>
<li>
<p>賬號:</p>
<p><input id="an" type="text" vld="nan" /></p>
</li>
<li style="height:60px">
<p>文本長度限制:</p>
<p><textarea id="len" style="width:300px; height:50px;" len="50" vld="nonull"></textarea></p>
</li>
<li>
<p>下拉框:</p>
<p><select id="ddl" vld="ddl"><option>請選擇</option><option value="1">中國</option></select></p>
</li>
<li>
<p>方形復選框:</p>
<p><input type="checkbox" id="check1" vld="check" value="1" /><label for="check1">是</label></p>
</li>
<li>
<p>圓形復選框:</p>
<p><input type="radio" id="radio1" vld="radio" value="1" /><label for="radio1">是</label></p>
</li>
<li>
<p>方形復選框:</p>
<p><input type="checkbox" id="Checkbox1" vld="checkgroup" name="dsa" value="1" err="必須選一個" super="y"/><label for="Checkbox1">是</label><input type="checkbox" id="Checkbox2" name="dsa" vld="checkgroup" value="1" /><label for="Checkbox2">是</label></p>
</li>
<li>
<p>圓形復選框:</p>
<p><input type="radio" id="radio2" vld="radiogroup" name="asd" value="1" /><label for="radio2">是</label><input type="radio" id="radio3" name="asd" vld="radiogroup" value="1" /><label for="radio3">是</label></p>
</li>
<li>
<input id="vldBtn" type="button" value="確認" />
</li>
</ul>
</form>
</body>
</html>