//$Id: checkForm.js,$
//tony 2004-3-30
//新增了对form的查询条件进行自动拼装的功能getQueryString();
/**
* 检查送出的form的每个表单元素是否符合填写要求
* @fm 需要检查的form元素。
* @return 如果form的所有表单元素都符合要求,将返回true,
* 否则将会报告不符合的原因,同时返回false。
* 示例:
*
* 说明:
* 在form表单元素的title属性中指明此表单元素期望的格式。
* 此格式说明如下
* 请填写邮件地址~email!
* 以最后一个"~"为界,前面的是提示信息,后面是格式信息。
* 格式信息请遵守以下规则:
* [number[f]:][type][!]
* 说明:
* number[f]: 一个数值后面跟一个":",表示此域的文本长度不可以超过指定的数值,如果在数值后面有个f表示固定长度必须为多少位
* type可以是如下表达式
* email 邮件地址
* int 整数
* float 浮点数
* date 日期
* time 时间
* hasChinese 含有中文
* allChinese 全部是中文
* noChinese 没有中文
* /.../[gi] 自定义正则式
* !表示此处文本不可以为空。
* 对于 格式串为
* "请选择一个选项~!"表示此radio组必须选择一个选项
* "请选择一个选项~"表示此radio组的选项可以不选。
* 对于或者格式串的意义为
* 说明信息~min:0max:3
* 对于非multiple类型
* "请选择一个选项~!"表示此select不可以选择第一个选项
* "请选择一个选项~"表示此select可以选择第一个选项
*/
function killErrors() {
return true;
}
function checkForm(fm)
{
//window.onerror = killErrors;
for(var i=0;i0)
{
if(format.charAt(colonP-1)=='f')
{
var lengthLimit=format.substring(0,colonP-1);
if(!isNaN(lengthLimit))
{
if(value.length!=lengthLimit)
{
//alert(info+"\n"+name+"的长度为"+value.length+"位,必须为"+lengthLimit+"位");
alert(info+"\n其长度为"+value.length+"位,必须为"+lengthLimit+"位");
fm[i].focus();
return false;
}
}
}
else
{
var lengthLimit=format.substring(0,colonP);
if(!isNaN(lengthLimit))
{
if(value.length>lengthLimit)
{
//alert(info+"\n"+name+"的长度("+value.length+")超过限制"+lengthLimit);
alert(info+"\n其长度("+value.length+")超过限制"+lengthLimit);
fm[i].focus();
return false;
}
}
}
}
}
format=format.substring(colonP+1,format.length);
//alert (format);
if(format=="email")
{
//电子邮件格式
var found = value.match(/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/);
if(found==null)
{
alert(info+"\n其格式不正确:\n\""+value+"\"不是一个Email地址");
fm[i].focus();
return false;
}
//console.log(value);
}
else if (format == "mobile") {
//验证手机
var found = value.match(/^1[3|4|5|7|8|9][0-9]\d{8}$/);
if (found == null) {
alert(info + "\n请输入正确手机号码");
fm[i].focus();
return false;
}
}
else if (format == "m") {
//验证手机
var found = value.match(/^1[3|4|5|7|8][0-9]\d{8}$/);
var found_tel = value.match(/^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$/);
if (found == null && found_tel == null) {
alert(info + "\n请输入正确手机号码或电话号码");
fm[i].focus();
return false;
}
}
else if (format == "tel") {
//验证座机
var found = value.match(/^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$/);
if (found == null) {
alert(info + "\n请输入正确座机号码");
fm[i].focus();
return false;
}
}
else if (format == "email|mobile") {
var found_1 = value.match(/^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/);
var found_2 = value.match(/^1[3|4|5|7|8][0-9]\d{8}$/);
if (found_1 == null && found_2 == null) {
alert(info + "\n请输入正确手机号码或邮箱地址");
fm[i].focus();
return false;
}
}
else if (format == "userid") {
//注册账号
var found = value.match(/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/);
if (found == null) {
alert(info + "\n其格式不正确:\n 4-19位英文加数字以英文字母开头");
fm[i].focus();
return false;
}
}
else if (format == "pwd") {
//密码格式
var found = value.match(/^(\w){6,20}$/);
if (found == null) {
alert(info + "\n密码不少于6位");
fm[i].focus();
return false;
}
}
else if (format == "pwd-check") {
//重复密码验证
var previ = i - 1;
var pwdvalue = fm[previ].value;
if (pwdvalue != value) {
alert("两次密码输入不一致");
fm[i].focus();
return false;
}
}
else if (format == "sfz") {
//验证身份证
var found = value.match(/^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/);
if (found == null) {
alert(info + "\n请输入正确身份证号");
fm[i].focus();
return false;
}
}
else if (format == "int") {
//整数
var intVal = parseInt(value);
if (isNaN(intVal) || intVal != value) {
//alert(info+"\n"+name+"的格式不正确:\n"+value+"不是一个整数。");
alert(info + "\n其格式不正确:\n" + value + "不是一个整数。");
fm[i].focus();
return false;
}
//内容的值的大小判断
var colonP = format1.indexOf(":");
if (colonP > 0) {
var lengthLimit = format1.substring(0, colonP);
if (!isNaN(lengthLimit)) {//alert(value);
if (parseInt(value) > parseInt(lengthLimit)) {
//alert(info+"\n"+name+"的长度("+value.length+")超过限制"+lengthLimit);
alert(info + "\n其值(" + value + ")超过限制" + lengthLimit);
fm[i].focus();
return false;
}
}
}
}
else if (format == "float") {
//浮点数
var floatVal = parseFloat(value);
if (isNaN(floatVal) || floatVal != value) {
//alert(info+"\n"+name+"的格式不正确:\n"+value+"不是一个浮点数。");
alert(info + "\n其格式不正确:\n" + value + "不是一个浮点数。");
fm[i].focus();
return false;
}
}
else if (format == "date") {
//日期
var found = value.match(/(\d{1,5})-(\d{1,2})-(\d{1,2})/);
var found2 = value.match(/(\d{1,5})\/(\d{1,2})\/(\d{1,2})/);
if (found == null || found[0] != value || found[2] > 12 || found[3] > 31) {
if (found2 == null || found2[0] != value || found2[2] > 12 || found2[3] > 31) {
//alert(info+"\n"+name+"的格式不正确:\n\""+value+"\"不是一个日期\n提示:[2000-01-01]");
alert(info + "\n其格式不正确:\n\"" + value + "\"不是一个日期\n提示:[2000-01-01]");
fm[i].focus();
return false;
}
}
var year = trim0(found[1]);
var month = trim0(found[2]) - 1;
var date = trim0(found[3]);
var d = new Date(year, month, date);
if (d.getFullYear() != year || d.getMonth() != month || d.getDate() != date) {
//alert(info+"\n"+name+"的内容不正确:\n\""+value+"\"不是一个正确的日期\n提示:[2000-01-01]");
alert(info + "\n其内容不正确:\n\"" + value + "\"不是一个正确的日期\n提示:[2000-01-01]");
fm[i].focus();
return false;
}
}
else if (format == "datetime") {
//alert(isDateStr(value));
if (!isDateStr(value)) {
alert(info + "\n其内容不正确:\n\"" + value + "\"不是一个正确的日期时间\n提示:[2000-01-01 05:38:00]");
fm[i].focus();
return false;
}
}
else if (format == "time") {
//时间
var found = value.match(/(\d{2}):(\d{2}):(\d{2})/);
if (found == null || found[0] != value || found[1] > 23 || found[2] > 59 || found[3] > 59) {
//alert(info+"\n"+name+"的格式不正确:\n\""+value+"\"不是一个时间\n提示:[05:38:00]");
alert(info + "\n其格式不正确:\n\"" + value + "\"不是一个时间\n提示:[05:38:00]");
fm[i].focus();
return false;
}
}
else if (format == "hasChinese") {
var _hasChinese = false;
for (var j = 0; j < value.length; j++) {
if (value.charCodeAt(j) > 255) {
_hasChinese = true;
break;
}
}
if (!_hasChinese) {
//alert(info+"\n"+name+"的内容需要中文:\n\""+value+"\"不含有任何中文字符");
alert(info + "\n其内容需要中文:\n\"" + value + "\"不含有任何中文字符");
fm[i].focus();
return false;
}
}
else if (format == "allChinese") {
for (var j = 0; j < value.length; j++) {
if (value.charCodeAt(j) <= 255) {
//alert(info+"\n"+name+"的内容要求全中文:\n\""+value+"\"含有非中文字符");
alert(info + "\n其内容要求全中文:\n\"" + value + "\"含有非中文字符");
fm[i].focus();
return false;
}
}
}
else if (format == "noChinese") {
for (var j = 0; j < value.length; j++) {
if (value.charCodeAt(j) > 255) {
//alert(info+"\n"+name+"的内容要求非中文:\n\""+value+"\"含有中文字符");
alert(info + "\n其内容要求非中文:\n\"" + value + "\"含有中文字符");
fm[i].focus();
return false;
}
}
}
else if (format != "") {
//自定义
try {
var found = value.match(eval(format));
if (found == null || found[0] != value) {
//alert(info+"\n"+name+"的格式不不符合要求:\""+value+"\"\n提示:["+format+"]");
//alert(info+"\n其格式不不符合要求:\""+value+"\"\n提示:["+format+"]");
alert(info);
fm[i].focus();
return false;
}
}
catch (e) {
//alert(e.name+":\n["+fm[i].name+"]不合法的正则式\""+format+"\"");
alert(e.name + ":\n不合法的正则式\"" + format + "\"");
return false;
}
}
}
return true;
}
function checkRadio(fm,opt)
{
var title=opt.title;
if(title=="")return true;//忽略未定义title的元素
var p=title.lastIndexOf("~");
if(p<0)return true;//忽略title中未定义检查格式的元素
var info=title.substring(0,p);
var format=title.substring(p+1,title.length);
var name=opt.name;
if(name=="")return true;//忽略没有名字的元素
if(format=="!")
{
//console.log(name);
//return false;
//必须选择一个选项
if(typeof(fm[name].length)=="undefined")
{
//同名radio只有一个
if(opt.checked)
{
return true;
}
else
{
//alert(info+"\n必须选择"+name);
alert(info+"\n必须选择");
opt.focus();
return false;
}
}
else
{
//是一个radio组
var radios=fm[name];
for(var j=0;jcheck_count)
{
//alert(info+"\n"+name+"至少需要选择"+min[1]+"个选项");
alert(info+"\n至少需要选择"+min[1]+"个选项");
opt.focus();
return false;
}
}
if(max!=null)
{
if(max[1]select_count)
{
//alert(info+"\n"+name+"至少需要选择"+min[1]+"个选项");
alert(info+"\n至少需要选择"+min[1]+"个选项");
sel.focus();
return false;
}
}
if(max!=null)
{
if(max[1]0)qStr="?"+qStr.substr(1);
return qStr;
}
function ec(va)
{
return va.replace(/\n/g,"%0D%0A");
}
/***********************************************************************
* 判断一个字符串是否为合法的日期格式:YYYY-MM-DD HH:MM:SS
* 或 YYYY-MM-DD 或 HH:MM:SS
*/
function isDateStr(ds){
parts = ds.split(' ');
//alert(parts.length);
switch(parts.length){
case 2:
if(isDatePart( parts[0] ) == true && isTimePart( parts[1] )){
return true;
}else{
return false;
}
case 1:
return false;
default:
return false;
}
}
/***********************************************************************
* 判断一个字符串是否为合法的日期格式:YYYY-MM-DD
*/
function isDatePart(dateStr){
var parts;
if(dateStr.indexOf("-") > -1){
parts = dateStr.split('-');
}else if(dateStr.indexOf("/") > -1){
parts = dateStr.split('/');
}else{
return false;
}
if(parts.length < 3){
//日期部分不允许缺少年、月、日中的任何一项
return false;
}
for(i = 0 ;i < 3; i ++){
//如果构成日期的某个部分不是数字,则返回false
if(isNaN(parts[i])){
return false;
}
}
y = parts[0];//年
m = parts[1];//月
d = parts[2];//日
if(y > 3000){
return false;
}
if(m < 1 || m > 12){
return false;
}
switch(d){
case 29:
if(m == 2){
//如果是2月份
if( (y / 100) * 100 == y && (y / 400) * 400 != y){
//如果年份能被100整除但不能被400整除 (即闰年)
}else{
return false;
}
}
break;
case 30:
if(m == 2){
//2月没有30日
return false;
}
break;
case 31:
if(m == 2 || m == 4 || m == 6 || m == 9 || m == 11){
//2、4、6、9、11月没有31日
return false;
}
break;
default:
}
return true;
}
/***********************************************************************
* 判断一个字符串是否为合法的时间格式:HH:MM:SS
*/
function isTimePart(timeStr){
var parts;
parts = timeStr.split(':');
if(parts.length < 2){
//日期部分不允许缺少小时、分钟中的任何一项
return false;
}
for(i = 0 ;i < parts.length; i ++){
//如果构成时间的某个部分不是数字,则返回false
if(isNaN(parts[i])){
return false;
}
}
h = parts[0];//年
m = parts[1];//月
if( h < 0 || h > 23){
//限制小时的范围
return false;
}
if( m < 0 || h > 59){
//限制分钟的范围
return false;
}
if(parts.length > 2){
s = parts[2];//日
if( s < 0 || s > 59){
//限制秒的范围
return false;
}
}
return true;
}