js form 验证函数 当前比较流行的错误提示


Posted in Javascript onJune 23, 2009

前段时间写了一个 js数据验证、js email验证、js url验证、js长度验证、js数字验证等 弹出对话框形式的 但是,现在不太流行那种很不友好的方式,于是重写了一个,封装得更加好的,更友好的层形式
共享给大家,如果大家使用有bug,请大家给我留言完善,谢谢了.
保存为 test.js

/** 
* 数据验证框架.增加了对id字段检查出错时,直接在对应后面添加一< span>元素来显示错误信息. 
* 
* @author wangzi6hao 
* @version 2.1 
* @description 2009-05-16 
*/ 
var checkData = new function() { 
var idExt="_wangzi6hao_Span";//生成span层的id后缀 
/** 
* 得到中英文字符长(中文为2个字符) 
* 
* @param {} 
* str 
* @return 字符长 
*/ 
this.length = function(str) { 
var p1 = new RegExp('%u..', 'g') 
var p2 = new RegExp('%.', 'g') 
return escape(str).replace(p1, '').replace(p2, '').length 
} /** 
* 删除对应id元素 
*/ 
this.remove = function(id) { 
var idObject = document.getElementById(id); 
if (idObject != null) 
idObject.parentNode.removeChild(idObject); 
} 
/** 
* 在对应id后面错误信息 
* 
* @param id:需要显示错误信息的id元素 
* str:显示错误信息 
*/ 
this.appendError = function(id, str) { 
this.remove(id + idExt);// 如果span元素存在,则先删除此元素 
var spanNew = document.createElement("span");// 创建span 
spanNew.id = id + idExt;// 生成spanid 
spanNew.style.color = "red"; 
spanNew.appendChild(document.createTextNode(str));// 给span添加内容 
var inputId = document.getElementById(id); 
inputId.parentNode.insertBefore(spanNew, inputId.nextSibling);// 给需要添加元素后面添加span 
} 
/** 
* @description 过滤所有空格字符。 
* @param str:需要去掉空间的原始字符串 
* @return 返回已经去掉空格的字符串 
*/ 
this.trimSpace = function(str) { 
str += ""; 
while ((str.charAt(0) == ' ') || (str.charAt(0) == '???') 
|| (escape(str.charAt(0)) == '%u3000')) 
str = str.substring(1, str.length); 
while ((str.charAt(str.length - 1) == ' ') 
|| (str.charAt(str.length - 1) == '???') 
|| (escape(str.charAt(str.length - 1)) == '%u3000')) 
str = str.substring(0, str.length - 1); 
return str; 
} 
/** 
* 过滤字符串开始部分的空格\字符串结束部分的空格\将文字中间多个相连的空格变为一个空格 
* 
* @param {Object} 
* inputString 
*/ 
this.trim = function(inputString) { 
if (typeof inputString != "string") { 
return inputString; 
} 
var retValue = inputString; 
var ch = retValue.substring(0, 1); 
while (ch == " ") { 
// 检查字符串开始部分的空格 
retValue = retValue.substring(1, retValue.length); 
ch = retValue.substring(0, 1); 
} 
ch = retValue.substring(retValue.length - 1, retValue.length); 
while (ch == " ") { 
// 检查字符串结束部分的空格 
retValue = retValue.substring(0, retValue.length - 1); 
ch = retValue.substring(retValue.length - 1, retValue.length); 
} 
while (retValue.indexOf(" ") != -1) { 
// 将文字中间多个相连的空格变为一个空格 
retValue = retValue.substring(0, retValue.indexOf(" ")) 
+ retValue.substring(retValue.indexOf(" ") + 1, 
retValue.length); 
} 
return retValue; 
} 
/** 
* 过滤字符串,指定过滤内容,如果内容为空,则默认过滤 '~!@#$%^&*()-+." 
* 
* @param {Object} 
* str 
* @param {Object} 
* filterStr 
* 
* @return 包含过滤内容,返回True,否则返回false; 
*/ 
this.filterStr = function(str, filterString) { 
filterString = filterString == "" ? "'~!@#$%^&*()-+.\"" : filterString 
var ch; 
var i; 
var temp; 
var error = false;// 当包含非法字符时,返回True 
for (i = 0; i <= (filterString.length - 1); i++) { 
ch = filterString.charAt(i); 
temp = str.indexOf(ch); 
if (temp != -1) { 
error = true; 
break; 
} 
} 
return error; 
} 
this.filterStrSpan = function(id, filterString) { 
filterString = filterString == "" ? "'~!@#$%^&*()-+.\"" : filterString 
var val = document.getElementById(id); 
if (this.filterStr(val.value, filterString)) { 
val.select(); 
var str = "不能包含非法字符" + filterString; 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查是否为网址 
* 
* @param {} 
* str_url 
* @return {Boolean} true:是网址,false:<b>不是</b>网址; 
*/ 
this.isURL = function(str_url) {// 验证url 
var strRegex = "^((https|http|ftp|rtsp|mms)?://)" 
+ "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" // ftp的user@ 
+ "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184 
+ "|" // 允许IP和DOMAIN(域名) 
+ "([0-9a-z_!~*'()-]+\.)*" // 域名- www. 
+ "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名 
+ "[a-z]{2,6})" // first level domain- .com or .museum 
+ "(:[0-9]{1,4})?" // 端口- :80 
+ "((/?)|" // a slash isn't required if there is no file name 
+ "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"; 
var re = new RegExp(strRegex); 
return re.test(str_url); 
} 
this.isURLSpan = function(id) { 
var val = document.getElementById(id); 
if (!this.isURL(val.value)) { 
val.select(); 
var str = "链接不符合格式;"; 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查是否为电子邮件 
* 
* @param {} 
* str 
* @return {Boolean} true:电子邮件,false:<b>不是</b>电子邮件; 
*/ 
this.isEmail = function(str) { 
var re = /^([a-zA-Z0-9]+[_|\-|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\-|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; 
return re.test(str); 
} 
this.isEmailSpan = function(id) { 
var val = document.getElementById(id); 
if (!this.isEmail(val.value)) { 
val.select(); 
var str = "邮件不符合格式;"; 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查是否为数字 
* 
* @param {} 
* str 
* @return {Boolean} true:数字,false:<b>不是</b>数字; 
*/ 
this.isNum = function(str) { 
var re = /^[\d]+$/ 
return re.test(str); 
} 
this.isNumSpan = function(id) { 
var val = document.getElementById(id); 
if (!this.isNum(val.value)) { 
val.select(); 
var str = "必须是数字;"; 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查数值是否在给定范围以内,为空,不做检查<br> 
* 
* @param {} 
* str_num 
* @param {} 
* small 应该大于或者等于的数值(此值为空时,只检查不能大于最大值) 
* @param {} 
* big 应该小于或者等于的数值(此值为空时,只检查不能小于最小值) 
* 
* @return {Boolean} <b>小于最小数值或者大于最大数值</b>数字返回false 否则返回true; 
*/ 
this.isRangeNum = function(str_num, small, big) { 
if (!this.isNum(str_num)) // 检查是否为数字 
return false 
if (small == "" && big == "") 
throw str_num + "没有定义最大,最小值数字!"; 
if (small != "") { 
if (str_num < small) 
return false; 
} 
if (big != "") { 
if (str_num > big) 
return false; 
} 
return true; 
} 
this.isRangeNumSpan = function(id, small, big) { 
var val = document.getElementById(id); 
if (!this.isRangeNum(val.value, small, big)) { 
val.select(); 
var str = ""; 
if (small != "") { 
str = "应该大于或者等于 " + small; 
} 
if (big != "") { 
str += " 应该小于或者等于 " + big; 
} 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查是否为合格字符串(不区分大小写)<br> 
* 是由a-z0-9_组成的字符串 
* 
* @param {} 
* str 检查的字符串 
* @param {} 
* idStr 光标定位的字段ID<b>只能接收ID</b> 
* @return {Boolean} <b>不是</b>"a-z0-9_"组成返回false,否则返回true; 
*/ 
this.isLicit = function(str) { 
var re = /^[_0-9a-zA-Z]*$/ 
return re.test(str); 
} 
this.isLicitSpan = function(id) { 
var val = document.getElementById(id); 
if (!this.isLicit(val.value)) { 
val.select(); 
var str = "是由a-z0-9_组成的字符串(不区分大小写);"; 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查二个字符串是否相等 
* 
* @param {} 
* str1 第一个字符串 
* @param {} 
* str2 第二个字符串 
* @return {Boolean} 字符串不相等返回false,否则返回true; 
*/ 
this.isEquals = function(str1, str2) { 
return str1 == str2; 
} 
this.isEqualsSpan = function(id, id1) { 
var val = document.getElementById(id); 
var val1 = document.getElementById(id1); 
if (!this.isEquals(val.value, val1.value)) { 
val.select(); 
var str = "二次输入内容必须一样;"; 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查字符串是否在给定长度范围以内(中文字符以2个字节计算),字符为空,不做检查<br> 
* 
* @param {} 
* str 检查的字符 
* @param {} 
* lessLen 应该大于或者等于的长度 
* @param {} 
* moreLen 应该小于或者等于的长度 
* 
* @return {Boolean} <b>小于最小长度或者大于最大长度</b>数字返回false; 
*/ 
this.isRange = function(str, lessLen, moreLen) { 
var strLen = this.length(str); 
if (lessLen != "") { 
if (strLen < lessLen) 
return false; 
} 
if (moreLen != "") { 
if (strLen > moreLen) 
return false; 
} 
if (lessLen == "" && moreLen == "") 
throw "没有定义最大最小长度!"; 
return true; 
} 
this.isRangeSpan = function(id, lessLen, moreLen) { 
var val = document.getElementById(id); 
if (!this.isRange(val.value, lessLen, moreLen)) { 
var str = "长度"; 
if (lessLen != "") 
str += "大于或者等于 " + lessLen + ";"; 
if (moreLen != "") 
str += " 应该小于或者等于 " + moreLen; 
val.select(); 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查字符串是否小于给定长度范围(中文字符以2个字节计算)<br> 
* 
* @param {} 
* str 字符串 
* @param {} 
* lessLen 小于或等于长度 
* 
* @return {Boolean} <b>小于给定长度</b>数字返回false; 
*/ 
this.isLess = function(str, lessLen) { 
return this.isRange(str, lessLen, ""); 
} 
this.isLessSpan = function(id, lessLen) { 
var val = document.getElementById(id); 
if (!this.isLess(val.value, lessLen)) { 
var str = "长度大于或者等于 " + lessLen; 
val.select(); 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查字符串是否大于给定长度范围(中文字符以2个字节计算)<br> 
* 
* @param {} 
* str 字符串 
* @param {} 
* moreLen 小于或等于长度 
* 
* @return {Boolean} <b>大于给定长度</b>数字返回false; 
*/ 
this.isMore = function(str, moreLen) { 
return this.isRange(str, "", moreLen); 
} 
this.isMoreSpan = function(id, moreLen) { 
var val = document.getElementById(id); 
if (!this.isMore(val.value, moreLen)) { 
var str = "长度应该小于或者等于 " + moreLen; 
val.select(); 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
/** 
* 检查字符不为空 
* 
* @param {} 
* str 
* @return {Boolean} <b>字符为空</b>返回true,否则为false; 
*/ 
this.isEmpty = function(str) { 
return str == ""; 
} 
this.isEmptySpan = function(id) { 
var val = document.getElementById(id); 
if (this.isEmpty(val.value)) { 
var str = "不允许为空;"; 
val.select(); 
this.appendError(id, str); 
return false; 
} else { 
this.remove(id + idExt); 
return true; 
} 
} 
}

下面是具体的测试页面:
<html> 
<head> 
<title>网页标题</title> 
<script type="text/javascript" src="test.js"></script> <script type="text/javascript"> 
function checkForm(){ 
var isPass = true; 
//过滤字符串 
if(!(checkData.isEmptySpan("filterStr") && checkData.filterStrSpan('filterStr','#$%$'))) { 
isPass = false; 
} 
//检查url 
if(!(checkData.isEmptySpan("isURL") && checkData.isURLSpan('isURL'))) 
isPass = false; 
//email 
if(!(checkData.isEmptySpan("isEmail") && checkData.isEmailSpan('isEmail'))) 
isPass = false; 
//数字 
if(!(checkData.isNumSpan('isNum'))) 
isPass = false; 
//数字大小 
if(!(checkData.isEmptySpan("isRangeNum") && checkData.isNumSpan('isRangeNum') && checkData.isRangeNumSpan('isRangeNum',10,100))) 
isPass = false; 
//密码 (数字,字母,下划线) 
if(!(checkData.isLicitSpan('isLicit'))) 
isPass = false; 
//二个字段是否相等 
if(!(checkData.isEmptySpan("isEquals") && checkData.isEqualsSpan('isEquals','isEquals1'))) 
isPass = false; 
//字符长度控制 
if(!(checkData.isRangeSpan('isRange',5,10))) 
isPass = false; 
//字符最短控制 
if(!(checkData.isLessSpan('isLess',10))) 
isPass = false; 
//字符最长控制 
if(!(checkData.isEmptySpan("isMore") && checkData.isMoreSpan('isMore',30))) 
isPass = false; 
//为空控制 
if(!(checkData.isEmptySpan("isEmpty"))) 
isPass = false; 
return isPass; 
} 
</script> 
</head> 
<body> 
<form action="index.jsp" method="post" onsubmit="return checkForm();"> 
<table> 
<tbody> 
<tr> 
<td>字符过滤:<input type="text" id="filterStr" name="filterStr"></td> 
<td>链接:<input type="text" id="isURL" name="isURL"></td> 
</tr> 
<tr> 
<td>邮件:<input type="text" id="isEmail" name="isEmail"></td> 
<td>数字:<input type="text" id="isNum" name="isNum"></td> 
</tr> 
<tr> 
<td>数字范围:<input type="text" id="isRangeNum" name="isRangeNum"></td> 
<td>a-zA-Z0-9_<input type="text" id="isLicit" name="isLicit"></td> 
</tr> 
<tr> 
<td>判断相等:<input type="text" id="isEquals" name="isEquals"></td> 
<td><input type="text" id="isEquals1" name="isEquals1"></td> 
</tr> 
<tr> 
<td>长度控制:<input type="text" id="isRange" name="isRange"></td> 
<td>长度大于控制:<input type="text" id="isLess" name="isLess"></td> 
</tr> 
<tr> 
<td>长度小于控制:<input type="text" id="isMore" name="isMore"></td> 
<td>是否为空:<input type="text" id="isEmpty" name="isEmpty"></td> 
</tr> 
<tr> 
<td><input type="submit" name="submit" value="提交数据"></td> 
</tr> 
</tbody> 
</table> 
</form> 
</body> 
</html>

效果图:
js form 验证函数 当前比较流行的错误提示
Javascript 相关文章推荐
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
Apr 01 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
Sep 09 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
Jan 08 Javascript
js动态创建表格,删除行列的小例子
Jul 20 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
Sep 17 Javascript
AngularJS中$interval的用法详解
Feb 02 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
Sep 21 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
Jul 05 Javascript
JS实现中文汉字按拼音排序的方法
Oct 09 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 Javascript
Html5生成验证码的示例代码
May 10 Javascript
javascript form 验证函数 弹出对话框形式
Jun 23 #Javascript
WordPress 照片lightbox效果的运用几点
Jun 22 #Javascript
WordPress JQuery处理沙发头像
Jun 22 #Javascript
JQuery 前台切换网站的样式实现
Jun 22 #Javascript
利用JQuery为搜索栏增加tag提示
Jun 22 #Javascript
web 页面分页打印的实现
Jun 22 #Javascript
利用WebBrowser彻底解决Web打印问题(包括后台打印)
Jun 22 #Javascript
You might like
几个php应用技巧
2008/03/27 PHP
php中OR与|| AND与&amp;&amp;的区别总结
2013/10/26 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
简单了解PHP编程中数组的指针的使用
2015/11/30 PHP
php实现头像上传预览功能
2017/04/27 PHP
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
Python探索之SocketServer详解
2017/10/28 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
python flask安装和命令详解
2019/04/02 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
html5启动原生APP总结
2020/07/03 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
Claire’s法国:时尚配饰、美容、珠宝、头发
2021/01/16 全球购物
酒店管理自荐信
2013/10/23 职场文书
小学生防溺水广播稿
2014/01/12 职场文书
仓管岗位职责范本
2014/02/08 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
养成教育主题班会
2015/08/13 职场文书
Java 死锁解决方案
2022/05/11 Java/Android
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server