工作中比较实用的JavaScript验证和数据处理的干货(经典)


Posted in Javascript onAugust 03, 2016

 在开发web项目的时候,难免遇到各种对网页数据的处理,比如对用户在表单中输入的电话号码、邮箱、金额、身份证号、密码长度和复杂程度等等的验证,以及对后台返回数据的格式化比如金额,返回的值为null,还有对指定日期之前或之后某一天或某一月的计算。

遇到需要对数据及表单验证的,我相信大家都像我一样,喜欢在网上找相关的方法,因为自己写的话,是比较耗时的。今天就给大家分享一下,自己在工作中总结的一些常用
的js。

关键代码如下所示:

/** 
* 验证密码复杂度(必须包含数字字母) 
* @param str 
* @returns true:满足规则,false:不满足 
*/ 
function validateStr(str){ 
var reg1 = /^(([0-9]{1,})([a-z]{1,}))|(([a-z]{1,})([0-9]{1,}))$/; 
var reg2 = /^(([0-9]{1,})([A-Z]{1,}))|(([A-Z]{1,})([0-9]{1,}))$/; 
//var reg3 = /^([a-zA-Z]{0,})[0-9a-z-A-z]{0,}[~`!@#$%^&*.]{0,}$/; 
str = valueTrim(str); 
//if(reg3.test(str)){ 
// return true; 
//} 
if(reg1.test(str)){ 
return true; 
} 
if(reg2.test(str)){ 
return true; 
} 
return false; 
} 
/** 
* 判断字符串长度 必须大于8位小于20位,一般用于密码 
* @param str 字符串 
* @returns 满足返回true 
*/ 
function valiDateLength(str){ 
if(str==null || str==''){ 
return false; 
} 
str = valueTrim(str); 
if(parseFloat(str.length)<8 ){ 
return false; 
} 
if(parseFloat(str.length)>20){ 
return false; 
} 
return true; 
} 
/** 
* 验证时间 
* @param dataValue 格式为:YYYY-MM-DD 
* @returns 匹配返回true 不匹配返回false 
*/ 
function valiDate(dateValue){ 
var result = dateValue.match(/((^((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)$))/); 
if(result==null){ 
return false; 
} 
return true; 
} 
/** 
* 验证电话号码 
* @param phoneValue 要验证的电话号码 
* @returns 匹配返回true 不匹配返回false 
*/ 
function validatePhone(phoneValue) { 
phoneValue = valueTrim(phoneValue); 
var reg = /^[1][0-9]{10}$/; 
return reg.test(phoneValue); 
} 
/** 
* 验证邮箱 
* @param emailValue 要验证的邮箱 
* @returns 匹配返回true 不匹配返回false 
*/ 
function validateEmail(emailValue){ 
var reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; 
return reg.test(emailValue); 
} 
/** 
* 判断是否是数字 
* @param numberValue 要验证的数据 
* @returns 匹配返回true 不匹配返回false 
*/ 
function isNumber(numberValue){ 
//定义正则表达式部分 
var reg1 = /^[0-9]{0,}$/; 
var reg2 = /^[1-9]{1}[0-9]{0,}$/; 
//alert(numberValue); 
if(numberValue ==null || numberValue.length==0){ 
return false; 
} 
numberValue = valueTrim(numberValue); 
//判断当数字只有1位时 
if(numberValue.length<2){ 
return reg1.test(numberValue); 
} 
return reg2.test(numberValue);; 
} 
/*** 
* 金额 
* @param value 
* @returns 
*/ 
function isMoney(value) { 
if(value==''){ 
return false; 
} 
value = valueTrim(value); 
value = value.replace(/(^\s*)|(\s*$)/g, ""); 
var reg = /^[0-9]*\.?[0-9]{0,2}$/; 
if(isNumber(value)){ 
return true; 
} 
if(value.length>3){ 
if(value.substr(0, 1)=="0"){ 
if(value.substr(3,value.length).length>2){ 
return false; 
} 
} 
} 
return reg.test(value); 
} 
/*** 
* 判断是否是0到100之间的数 
* @param value 
* @returns 
*/ 
function isZeroToOne(value) { 
if(value==''){ 
return false; 
} 
value = valueTrim(value); 
if(isMyFloat(value)){ 
if(parseFloat(value)<100 && parseFloat(value)>0){ 
return true; 
} 
} 
return false; 
} 
/** 
* 验证是否是浮点数 
* @param floatValue 要验证的数据 
* @returns 匹配返回true 不匹配返回false 
*/ 
function isMyFloat(floatValue){ 
if(floatValue==''){ 
return false; 
} 
floatValue = valueTrim(floatValue); 
var reg = /^(\d+)(\.\d+)$/; 
if(isNumber(floatValue)){ 
return true; 
} 
if(floatValue.length>3){ 
if(floatValue.substr(0, 1)=="0"){ 
if(floatValue.substr(0, 2)!="0."){ 
return false; 
} 
} 
} 
return reg.test(floatValue); 
} 
/** 
* 判断是否是汉字 
* @param charValue 要验证的数据 
* @returns 匹配返回true 不匹配返回false 
*/ 
function isCharacter(charValue){ 
var reg = /^[\u4e00-\u9fa5]{0,}$/; 
return reg.test(charValue); 
} 
/** 
* 验证座机号 
* @param telValue 要验证的座机号 
* @returns 匹配返回true 不匹配返回false 
*/ 
function valiDateTel(telValue){ 
var reg = /^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$/; 
telValue = valueTrim(telValue); 
if(!reg.test(telValue)){ 
return false; 
} 
return true; 
} 
var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 
var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]; // 身份证验证位值.10代表X 
/** 
* 验证身份证 
* @param idCard 需要验证的身份证号 
* @returns 匹配返回true 不匹配返回false 
*/ 
function IdCardValidate(idCardValue) { 
//去掉字符串头尾空格 
idCardValue = valueTrim(idCardValue.replace(/ /g, "")); 
if (idCardValue.length == 15) { 
//进行15位身份证的验证 
return isValidityBrithBy15IdCard(idCardValue); 
} else if (idCardValue.length == 18) { 
// 得到身份证数组 
var a_idCard = idCardValue.split(""); 
//进行18位身份证的基本验证和第18位的验证 
if(isValidityBrithBy18IdCard(idCardValue)&&isTrueValidateCodeBy18IdCard(a_idCard)){ 
return true; 
}else { 
return false; 
} 
} else { 
return false; 
} 
} 
/** 
* 判断身份证号码为18位时最后的验证位是否正确 
* @param a_idCard 身份证号码数组 
* @return 
*/ 
function isTrueValidateCodeBy18IdCard(a_idCard) { 
var sum = 0; // 声明加权求和变量 
if (a_idCard[17].toLowerCase() == 'x') { 
a_idCard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作 
} 
for ( var i = 0; i < 17; i++) { 
sum += Wi[i] * a_idCard[i];// 加权求和 
} 
valCodePosition = sum % 11; // 得到验证码所位置 
if (a_idCard[17] == ValideCode[valCodePosition]) { 
return true; 
} else { 
return false; 
} 
} 
/** 
* 验证18位数身份证号码中的生日是否是有效生日 
* @param idCard 18位书身份证字符串 
* @return 
*/ 
function isValidityBrithBy18IdCard(idCard18){ 
var year = idCard18.substring(6,10); 
var month = idCard18.substring(10,12); 
var day = idCard18.substring(12,14); 
var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
// 这里用getFullYear()获取年份,避免千年虫问题 
if(temp_date.getFullYear()!=parseFloat(year) 
||temp_date.getMonth()!=parseFloat(month)-1 
||temp_date.getDate()!=parseFloat(day)){ 
return false; 
}else{ 
return true; 
} 
} 
/** 
* 验证15位数身份证号码中的生日是否是有效生日 
* @param idCard15 15位书身份证字符串 
* @return 
*/ 
function isValidityBrithBy15IdCard(idCard15){ 
var year = idCard15.substring(6,8); 
var month = idCard15.substring(8,10); 
var day = idCard15.substring(10,12); 
var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day)); 
// 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法 
if(temp_date.getYear()!=parseFloat(year) 
||temp_date.getMonth()!=parseFloat(month)-1 
||temp_date.getDate()!=parseFloat(day)){ 
return false; 
}else{ 
return true; 
} 
} 
//去掉字符串头尾空格 
function valueTrim(str) { 
return str.replace(/(^\s*)|(\s*$)/g, ""); 
} 
/** 
* 检验18位身份证号码(15位号码可以只检测生日是否正确即可,自行解决) 
* @param idCardValue 18位身份证号 
* @returns 匹配返回true 不匹配返回false 
*/ 
function idCardVildate(cid){ 
var arrExp = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];//加权因子 
var arrValid = [1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2];//校验码 
var reg = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/; 
if(reg.test(cid)){ 
var sum = 0, idx; 
for(var i = 0; i < cid.length - 1; i++){ 
// 对前17位数字与权值乘积求和 
sum += parseInt(cid.substr(i, 1), 10) * arrExp[i]; 
} 
// 计算模(固定算法) 
idx = sum % 11; 
// 检验第18为是否与校验码相等 
return arrValid[idx] == cid.substr(17, 1).toUpperCase(); 
}else{ 
return false; 
} 
} 
/** 
* 获取指定日期之前或之后的第几天 
* 
* @param dayCount 
* 正数为以后时间,负数为以前时间 如:1表示为明天,-1为昨天 
* 
*/ 
function getDateStr(dates, dayCount) { 
var dateTime = dayCount * 24 * 60 * 60 * 1000; 
var dd = new Date(); 
if (dates == "") { 
dd = new Date(); 
} else { 
dd = new Date(dates); 
} 
var dateNumber = dd.getTime() + dateTime; 
var newDate = new Date(dateNumber); 
var y = newDate.getFullYear(); 
var m = newDate.getMonth() + 1;// 获取当前月份的日期 
var d = newDate.getDate(); 
if (m < 10) { 
m = "0" + m; 
} 
if (d < 10) { 
d = "0" + d; 
} 
return y + "-" + m + "-" + d; 
} 
/** 
* 获取指定月份的之前或之后的第几个月 
* 
* @param dayCount 
* 正数为以后月份,负数为以前月份 如:1表示为下月,-1为上月 
* 
*/ 
function getMonthStr(dates, monthCount) { 
var dd = new Date(); 
if (dates == "") { 
dd = new Date(); 
} else { 
dd = new Date(dates); 
} 
var y = dd.getFullYear(); 
var m = dd.getMonth() + 1;// 获取当前月份的日期 
m = m + monthCount; 
if (m == 0) { 
m = "12"; 
y = y - 1; 
} else if (m < 10) { 
m = "0" + m; 
} else if (m > 12) { 
m = m - 12; 
m = "0" + m; 
y = y + 1; 
} 
return y + "-" + m; 
} 
/** 
* 
*对val值为undefined返回“”,否则返回原值 
*/ 
function dealNull(val) { 
if (typeof (val) == "undefined") { 
return ""; 
} else { 
return val; 
} 
}

以上所述是小编给大家介绍的工作中比较实用的JavaScript验证和数据处理的干货(经典),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
为javascript添加String.Format方法
Aug 11 Javascript
DIV菜单层实现代码
Nov 19 Javascript
JS实现仿京东淘宝竖排二级导航
Dec 08 Javascript
jQuery中的jQuery()方法用法分析
Dec 27 Javascript
chrome不支持form.submit的解决方案
Apr 28 Javascript
javascript获取重复次数最多的字符
Jul 08 Javascript
javascript电商网站抢购倒计时效果实现
Nov 19 Javascript
Jquery中巧用Ajax的beforeSend方法
Jan 20 Javascript
用file标签实现多图文件上传预览
Feb 14 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
Feb 15 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
Feb 01 Javascript
使用webpack搭建react开发环境的方法
May 15 Javascript
深入浅出讲解ES6的解构
Aug 03 #Javascript
JS模拟实现方法重载示例
Aug 03 #Javascript
jQuery数组处理函数整理
Aug 03 #Javascript
功能强大的Bootstrap组件(结合js)
Aug 03 #Javascript
AngularJS基础 ng-submit 指令简单示例
Aug 03 #Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 #Javascript
AngularJS教程 ng-style 指令简单示例
Aug 03 #Javascript
You might like
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
jquery each()源代码
2011/02/14 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
Python如何给函数库增加日志功能
2020/08/04 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
预备党员思想汇报范文
2014/01/11 职场文书
品酒会策划方案
2014/05/26 职场文书
小区推广策划方案
2014/06/06 职场文书
销售顾问工作计划书
2014/09/15 职场文书
公司放假通知怎么写
2015/04/15 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
2015年商场工作总结
2015/04/27 职场文书
花木兰观后感
2015/06/10 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS