摘要:JavaScript:自製-常用驗證函式
這是我經過三家公司的工作經驗後,及網路大抄特抄,因為取之於網路,用之於網路。(大抄特抄都不知道從哪抄來了!冏)
只好分享出來。
經過我包裝所完成的常用驗證函式,可以解決,常用的驗證(身份證、日期、日期區間、E-mail、數字、整數、要求輸入資料、驗證長度for 中英夾雜 using in varchar)
有了這個,還需要去用ValidControl嗎?(其實本人不愛用ValidControl,愛用舊技術之JavaScript,彈性比較高)
// JScript File //******************加強javascript功能*****// String.prototype.Trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); } String.prototype.LTrim = function() { return this.replace(/(^\s*)/g, ""); } String.prototype.RTrim = function() { return this.replace(/(\s*$)/g, ""); } //******************驗證*******************// //檢測中英文夾雜字串實際長度 function CheckLen(ControlID,Length,FieldDesc,blnRequest) { var control = GetControl(ControlID); var value = GetControlValue(ControlID); var strAlert = ""; if(blnRequest==true) { strAlert = CheckControl("Request",ControlID,FieldDesc); if(strAlert != "") return strAlert; } else if(value=="") return ""; if( blen(value) > Length ) { return FieldDesc+" 欄位中文字不可超過"+(Length/2)+"個字或英文字不可超過"+Length+"個字!\r\n"; } return ""; } //檢測中英文夾雜字串實際長度 function blen(str) { //參考網址 //http://www.360doc.com/content/081222/15/16915_2177384.html var len = str.match(/[^ -~]/g) == null ? str.length : str.length + str.match(/[^ -~]/g).length ; return len; } //判斷起始時間是否大於結束時間 function CheckDateRange (BegDateID,EndDateID,FieldDesc,blnRequest) { var objBegDate; var objEndDate; var valueBegDate,valueEndDate; objBegDate = GetControl(BegDateID); objEndDate = GetControl(EndDateID); valueBegDate = GetControlValue(BegDateID); valueEndDate = GetControlValue(EndDateID); dtBegDate = Date.parse(objBegDate.value); dtEndDate = Date.parse(objEndDate.value); if(blnRequest==true) { strAlert = CheckControl("Request",BegDateID,FieldDesc+"開始日期"); if(strAlert != "") return strAlert; strAlert = CheckControl("Request",EndDateID,FieldDesc+"結束日期"); if(strAlert != "") return strAlert; } else if(valueBegDate=="" || valueEndDate) return ""; if(dtBegDate > dtEndDate) { return "日期較大的, 不能放在前面 !\r\n"; } return ""; } //判斷是否為日期格式 function CheckDate(ControlID,FieldDesc,blnRequest) { var control = GetControl(ControlID); var value = GetControlValue(ControlID); if(blnRequest==true) { strAlert = CheckControl("Request",ControlID,FieldDesc); if(strAlert != "") return strAlert; } else if(value=="") return ""; //規則 yyyy/mm/dd var obj,strValue,flag=false; strValue = GetControlValue(ControlID); if(strValue == "" ) return ""; var objRegExp = /^\d{4}\/\d{1,2}\/\d{1,2}$/; //check to see if in correct format if(!objRegExp.test(strValue)) { return FieldDesc+" 欄位必須為西元日期格式 ! (yyyy/mm/dd)\r\n"; //doesn't match pattern, bad date } else{ var strSeparator = '/'; var arrayDate = strValue.split(strSeparator); //create a lookup for months not equal to Feb. var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31, '06' : 30,'07' : 31, '08' : 31,'09' : 30, '10' : 31,'11' : 30,'12' : 31} var intDay = parseInt(arrayDate[2],10); //check if month value and day value agree if(arrayLookup[arrayDate[1]] != null) { if(intDay <= arrayLookup[arrayDate[1]] && intDay != 0) flag= true; //found in lookup table, good date } //check for February (bugfix 20050322) //bugfix for parseInt kevin //bugfix biss year O.Jp Voutat var intMonth = parseInt(arrayDate[1],10); if (intMonth == 2) { var intYear = parseInt(arrayDate[0]); if (intDay > 0 && intDay < 29) { flag= true; } else if (intDay == 29) { if ((intYear % 4 == 0) && (intYear % 100 != 0) || (intYear % 400 == 0)) { // year div by 4 and ((not div by 100) or div by 400) ->ok flag= true; } } } } if(flag==false) { return FieldDesc+" 欄位日期資料有誤 !\r\n"; } return ""; } //判斷是否為數字格式 function CheckNumber(ControlID,FieldDesc,blnRequest) { var control = GetControl(ControlID); var value = GetControlValue(ControlID); if(blnRequest==true) { strAlert = CheckControl("Request",ControlID,FieldDesc); if(strAlert != "") return strAlert; } else if(value=="") return ""; if(IsNumber(value)==false) { return FieldDesc+" 欄位必須為數字 !\r\n"; } return ""; } //判斷是否為整數格式 function CheckInteger(ControlID,FieldDesc,blnRequest) { var control = GetControl(ControlID); var value = GetControlValue(ControlID); if(blnRequest==true) { strAlert = CheckControl("Request",ControlID,FieldDesc); if(strAlert != "") return strAlert; } else if(value=="") return ""; if(IsInteger(value)==false) { return FieldDesc +" 欄位必須為整数 !\r\n"; } return ""; } //判斷是否為Email格式 function CheckEmail(ControlID,FieldDesc,blnRequest) { var control = GetControl(ControlID); var value = GetControlValue(ControlID); if(blnRequest==true) { strAlert = CheckControl("Request",ControlID,FieldDesc); if(strAlert != "") return strAlert; } else if(value=="") return ""; if(IsEmail(value)==false) { return FieldDesc +" 欄位必須為E-mail!\r\n"; } return ""; } //判斷是否為身份證字號格式 function CheckIdNumber(ControlID,FieldDesc,blnRequest) { var control = GetControl(ControlID); var value = GetControlValue(ControlID); if(blnRequest==true) { strAlert = CheckControl("Request",ControlID,FieldDesc); if(strAlert != "") return strAlert; } else if(value=="") return ""; if(IsIdNumber(value)==false) { return FieldDesc +" 欄位必須為身份證字號格式!\r\n"; } return ""; } //確認是否輸入資料 function CheckRequest(ControlID,FieldDesc) { var control =GetControl(ControlID); var value = GetControlValue(ControlID); var tagName = control.tagName.toLowerCase(); if(tagName=="select") { if(control.options[control.selectedIndex].value=="") { return "請選擇"+FieldDesc+"\r\n"; } else return ""; } else if(tagName=="input") { var type = control.type switch(type) { case "text": if(IsEmpty(value)) { return "請輸入"+FieldDesc+"\r\n"; } break; case "checkbox": break; case "radio": break; } } return ""; } //*******************************共用方法***********************************// //取得控制項 function GetControlValue(ControlID) { var control; var value; control = GetControl(ControlID); value = control.value; return value } //取得控制項的值 function GetControl(ControlID) { return document.getElementById(ControlID); } //強化版測試Function function CheckControl(type,ControlID,FieldDesc,blnRequest) { switch(type) { case "Date": return CheckDate(ControlID,FieldDesc,blnRequest) ; break; case "Number": return CheckNumber(ControlID,FieldDesc,blnRequest); break; case "Integer": return CheckInteger(ControlID,FieldDesc,blnRequest); break; case "Email": return CheckEmail(ControlID,FieldDesc,blnRequest); break; case "IdNumber": return CheckIdNumber(ControlID,FieldDesc,blnRequest); break; case "Request": return CheckRequest(ControlID,FieldDesc,blnRequest); break; } } //控制項焦點設定 function ControlFocus(ControlID) { var control = GetControl(ControlID); control.focus(); } //*******************************基本判斷Function***************************// //判斷是否為數字 function IsNumber(value) { if(isNaN(value)) return false; return true; } //判斷是否為整數 function IsInteger(value) { var objRegExp = /^-?\d+$/; if(!objRegExp.test(value)) return false; return true; } //判斷控制項必須要有值 function IsEmpty(value) { if(value.Trim()=="") return true; else return false; } //判斷是否為E-mail function IsEmail(value) { var objRegExp = /^.+@.+\..+$/; if(!objRegExp.test(value)) return false; return true; } //判斷是否為身份證字號 function IsIdNumber(value) { // 依照字母的編號排列,存入陣列備用。 var letters = new Array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'W', 'Z', 'I', 'O'); // 儲存各個乘數 var multiply = new Array(1, 9, 8, 7, 6, 5, 4, 3, 2, 1); var nums = new Array(2); var firstChar; var firstNum; var lastNum; var total = 0; // 撰寫「正規表達式」。第一個字為英文字母, // 第二個字為1或2,後面跟著8個數字,不分大小寫。 var regExpID=/^[a-z](1|2)\d{8}$/i; // 使用「正規表達式」檢驗格式 if (value.search(regExpID)==-1) { // 基本格式錯誤 return false; } else { // 取出第一個字元和最後一個數字。 firstChar = value.charAt(0).toUpperCase(); lastNum = value.charAt(9); } // 找出第一個字母對應的數字,並轉換成兩位數數字。 for (var i=0; i<26; i++) { if (firstChar == letters[i]) { firstNum = i + 10; nums[0] = Math.floor(firstNum / 10); nums[1] = firstNum - (nums[0] * 10); break; } } // 執行加總計算 for(var i=0; i<multiply.length; i++){ if (i<2) { total += nums[i] * multiply[i]; } else { total += parseInt(value.charAt(i-1)) * multiply[i]; } } // 和最後一個數字比對 if ((10 - (total % 10))!= lastNum) { return false; } return true; }