客户端JS检测方法集合

本文回顾了作者在客户端检测方面的心路历程,从手工校验到利用集中消灭、链式编程、自定义属性、可配置等方法,逐步优化用户体验和减轻服务器负担。通过引入JQuery和JSON配置,实现简洁优雅的检测逻辑,并展示了如何通过配置文件灵活调整检测规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.pin5i.com/showtopic-23278.html


大家都知道,客户端检测不单可以让用户获得更好的体验,而且可以通过校验数据大大减少客户端和服务器端的往返次数,减少服务器负担。在这里,小弟打算回顾一下自己在客户端检测方面的学习历程和采用方法,如果大家有什么更好的方法或者建议,欢迎提出来共享!共同进步!

为了方便举例和说明,先构建一个简单的html页面,如下:

html

  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head>
  3. <title>JS Verify</title>
  4. </head>
  5. <body>
  6.     <div>
  7.         <span>请输入用户名,年龄和自我介绍:</span>
  8.         <br />
  9.         <span>用户名:<input type="text" id="txtName" size="20" /></span>
  10.         <br />
  11.         <span>年龄:<input type="text" id="txtAge" size="5" />岁</span>
  12.         <br />
  13.         <span>自我介绍:</span>
  14.         <br />
  15.         <span><textarea id="txtIntro" rows="10" cols="50"></textarea></span>
  16.         <br />
  17.         <span><input type="button" value="提交信息" /></span>
  18.     </div>
  19. </body>
  20. </html>
复制代码
第一阶段是:续项强写

每个人都基本会经过这个阶段,就是对检测内容每个都手工校验。很惭愧,自己也写过不少这样的代码。。这个阶段的代码如下:
  1. function SubmitInfo()
  2. {
  3.     var name = document.getElementById("txtName");
  4.     var age = document.getElementById("txtAge");
  5.     var intro = document.getElementById("txtIntro");
  6.     if(name == null || name.value == "")
  7.     {
  8.         alert("请输入用户名!");
  9.         return false;
  10.     }
  11.     if(!/^[\u4E00-\u9FA5a-z0-9_]*$/gi.test(name.value))
  12.     {
  13.         alert("用户名只能由中文,英文,数字及下划线组成!");
  14.         return false;
  15.     }
  16.     if(age == null || age.value == "")
  17.     {
  18.         alert("请输入年龄!");
  19.         return false;
  20.     }
  21.     if(!/^[1-9]\d$/.test(age.value))
  22.     {
  23.         alert("年龄必须为正整数!");
  24.         return false;
  25.     }
  26.     if(intro == null || intro.value == "")
  27.     {
  28.         alert("请输入自我介绍!");
  29.         return false;
  30.     }
  31.     alert("提交成功!");
  32.     return true;
  33. }
复制代码
不评价这个了。。因为每个人都可能因为写这些方法检测逻辑写得眼冒星星手抽筋的!弄的经常下班了还在扑哧扑哧的写啊写。。。。


第二阶段:集中消灭

相信不少初学者现在还是处于这个阶段,这阶段的同学们已经被第一阶段折磨怕了。很快就想出了集中消灭相同类型检测的方法。就是写检测函数,如下:
  1. function isEmpty(obj)
  2. {
  3.     if(obj == null || obj.value == "")
  4.         return false;
  5.     return true;
  6. }

  7. function isInt(val)
  8. {
  9.     return /^[1-9]\d$/.test(val);
  10. }

  11. function isSafeString(val)
  12. {
  13.     return /^[\u4E00-\u9FA5a-z0-9_]*$/gi.test(val);
  14. }
复制代码
同学们很可能还将上边代码独立成一个公共类,叫Common.js什么的,然后实际检测引用一下,就容易多了:
  1. function SubmitInfo()
  2. {
  3.     var name = document.getElementById("txtName");
  4.     var age = document.getElementById("txtAge");
  5.     var intro = document.getElementById("txtIntro");
  6.     if(!isEmpty(name))
  7.     {
  8.         alert("请输入用户名!");
  9.         return false;
  10.     }
  11.     if(!isSafeString(name.value))
  12.     {
  13.         alert("用户名只能由中文,英文,数字及下划线组成!");
  14.         return false;
  15.     }
  16.     if(!isEmpty(age))
  17.     {
  18.         alert("请输入年龄!");
  19.         return false;
  20.     }
  21.     if(!isInt(age.value))
  22.     {
  23.         alert("年龄必须为正整数!");
  24.         return false;
  25.     }
  26.     if(!isEmpty(intro))
  27.     {
  28.         alert("请输入自我介绍!");
  29.         return false;
  30.     }
  31.     alert("提交成功!");
  32.     return true;
  33. }
复制代码
看,不用每次写那些该死检测逻辑了。。要检测什么只要调用一下已经写好的公共检测方法就行了。轻松吧?!不过,还能更轻松吗?当然!请看:


第三阶段:链式的威力

看着一大堆if else总是心里觉得不舒服,对吧?一串串的又不是羊肉串,虽然不能吃,也要消灭它们!这时候,是 Java script的prototype出场的时候了。通过扩展prototype,可以获得简洁优雅的代码:
  1. function SubmitInfo()
  2. {
  3.     var name = document.getElementById("txtName");
  4.     var age = document.getElementById("txtAge");
  5.     var intro = document.getElementById("txtIntro");

  6.     if(!name.value.initVerify().isEmpty("请输入用户名!").isSafeString("用户名只能由中文,英文,数字及下划线组成!").verifyComplete())
  7.         return false;
  8.     
  9.     if(!age.value.initVerify().isEmpty("请输入年龄!").isInt("年龄必须为正整数!").verifyComplete())
  10.         return false;
  11.     
  12.     if(!intro.value.initVerify().isEmpty("请输入自我介绍!").verifyComplete())
  13.         return false;
  14.     
  15.     alert("提交成功!");
  16.     return true;
  17. }
复制代码
很简洁吧?相对前边一大串的羊肉串,是不是顺眼多了啊?哦,如何实现?其实很简单:
  1. var validateStatus;
  2. var validateMessage;

  3. String.prototype.initVerify = function()
  4. {
  5.     validateStatus = true;
  6.     validateMessage = "";
  7.     return this;
  8. }

  9. String.prototype.isEmpty = function(msg)
  10. {
  11.     if(validateStatus)
  12.     {
  13.         if(this == null || this == "")
  14.         {
  15.             validateStatus = false;
  16.             validateMessage = msg;
  17.         }
  18.     }
  19.     return this;
  20. }

  21. String.prototype.isInt = function(msg)
  22. {
  23.     if(validateStatus)
  24.     {
  25.         if(!/^[1-9]\d$/.test(this))
  26.         {
  27.             validateStatus = false;
  28.             validateMessage = msg;
  29.         }
  30.     }
  31.     return this;
  32. }

  33. String.prototype.isSafeString = function(msg)
  34. {
  35.     if(validateStatus)
  36.     {
  37.         if(!/^[\u4E00-\u9FA5a-z0-9_]*$/gi.test(this))
  38.         {
  39.             validateStatus = false;
  40.             validateMessage = msg;
  41.         }
  42.     }
  43.     return this;
  44. }

  45. String.prototype.verifyComplete = function()
  46. {
  47.     if(!validateStatus)
  48.         alert(validateMessage);
  49.     return validateStatus;
  50. }
复制代码
怎么样?是不是很简单啊?这个prototype真是一个好东西啊!!链式编程,赞!!呵呵,怎么?你还不满足,代码太长?人心不足啊。我试试吧。。

第四阶段:自定义属性

这个阶段的提交函数如下:
  1. function SubmitInfo()
  2. {
  3.     if(!Verify(document.getElementById("txtName"))) return false;
  4.     if(!Verify(document.getElementById("txtAge"))) return false;
  5.     if(!Verify(document.getElementById("txtIntro"))) return false;
  6.     
  7.     alert("提交成功!");
  8.     return true;
  9. }
复制代码
想不通吧?怎么所有检测都一样啊?这不忽悠人吗?哈哈,要实现这个需要在html代码加点酱料:
  1.     <div>
  2.         <span>请输入用户名,年龄和自我介绍:</span>
  3.         <br />
  4.         <span>用户名:<input type="text" id="txtName" size="20" verifyOptions='{"Empty":{"Flag":false,"Message":"请输入用户名!"},"SafeString":{"Message":"用户名只能由中文,英文,数字及下划线组成!"}}' /></span>
  5.         <br />
  6.         <span>年龄:<input type="text" id="txtAge" size="5" verifyOptions='{"Empty":{"Flag":false,"Message":"请输入年龄!"},"Int":{"Message":"年龄必须为正整数!"}}' />岁</span>
  7.         <br />
  8.         <span>自我介绍:</span>
  9.         <br />
  10.         <span><textarea id="txtIntro" rows="10" cols="50" verifyOptions='{"Empty":{"Flag":false,"Message":"请输入自我介绍!"}}' ></textarea></span>
  11.         <br />
  12.         <span><input type="button" οnclick="return SubmitInfo();" value="提交信息" /></span>
  13.     </div>
复制代码
看到了吧,我们自定义了个叫verifyOption的属性,就是根据它们实现的分别对待的。就好像每个人都有银行卡,但是里面的钱都不一样一样(这个比喻好像比较牵强^_^)

还是看看Verify函数到底干了什么东西吧:
  1. function Verify(obj)
  2. {
  3.     if(obj.attributes["verifyOptions"] == undefined)
  4.     {
  5.         alert("请定义verifyOptions!")
  6.         return false;
  7.     }
  8.     var options = obj.attributes["verifyOptions"].nodeValue;
  9.     if(!options.isEmpty("检测参数不正确!"))
  10.         return false;
  11.     
  12.     options = options.parseJSON();
  13.     
  14.     if(options.Empty != undefined && options.Empty.Flag == false)
  15.     {
  16.         if(!obj.value.isEmpty(options.Empty.Message))
  17.             return false;
  18.     }
  19.     if(options.Int != undefined)
  20.     {
  21.         if(!obj.value.isInt(options.Int.Message))
  22.             return false;
  23.     }
  24.     if(options.SafeString != undefined)
  25.     {
  26.         if(!obj.value.isSafeString(options.SafeString.Message))
  27.             return false;
  28.     }
  29.     return true;
  30. }
复制代码
就是检测自定义属性里面的设置,根据设置来进行相应检测。这下大家满足了吧?每次检测都一律一句Verify(*)就搞掂了!!QA的MM说检测不对?哦,不用急不用急,修改一下自定义属性verifyOption就好了。哈哈~~~

第五阶段:可配置

怎么还有第五阶段?疯狂了疯狂了~~(小子去死!!番茄,鸡蛋都丢上来了~~)唉,大家要注意文明礼貌嘛,丢着我没有关系,丢着花花草草也不好嘛。
  1. <div>
  2.     <span>请输入用户名,年龄和自我介绍:</span>
  3.     <br />
  4.     <span>用户名:<input type="text" id="txtName" size="20" /></span>
  5.     <br />
  6.     <span>年龄:<input type="text" id="txtAge" size="5" />岁</span>
  7.     <br />
  8.     <span>自我介绍:</span>
  9.     <br />
  10.     <span><textarea id="txtIntro" rows="10" cols="50"></textarea></span>
  11.     <br />
  12.     <span><input id="btnSubmit" type="button" value="提交信息" /></span>
  13. </div>
复制代码
第五阶段的html代码已经回复清爽了,毕竟自定义属性好像不太友善,不标准!既然不标准就放弃吧!是不是有同学怀疑,这样检测函数岂不是要写更对逻辑,一定比较臃肿吧?好吧,大家看检测函数:
  1. function SubmitInfo()
  2. {
  3.     if(!VerifyComplete())
  4.         return false;
  5.     
  6.     alert("提交成功!");
  7.     return true;
  8. }
复制代码
不是吧??骗人的吧?但是,事实如此,第五阶段就是这样简洁,这样优雅的实现了和上边几个阶段同样的功能。不相信,那就来看看吧!不过,第五阶段为了方便,引用了JQuery,找东西,它的 搜索 器还真好用。

这个阶段我们的检测配置都写到一个变量里面了:
  1. var verifyConfig = [
  2. {"Id":"txtName", "Option":{"Empty":{"Flag":false,"Message":"请输入用户名!"},"SafeString":{"Message":"用户名只能由中文,英文,数字及下划线组成!"}}},
  3. {"Id":"txtAge", "Option":{"Empty":{"Flag":false,"Message":"请输入年龄!"},"Int":{"Message":"年龄必须为正整数!"}}},
  4. {"Id":"txtIntro", "Option":{"Empty":{"Flag":false,"Message":"请输入自我介绍!"}}}]; 
复制代码
这个变量我叫配置变量,建议大家将这些变量都放到同一个文件,叫verifyConfig.js?反正我是这么叫的,要修改检测逻辑,就修改这个配置文件就好了,当然,例子由于要强调第五阶段的简洁,就将VerifyComplete()函数参数设置为空,其实它应该有一个参数,用来传入设置变量。这样才通用。

最后奉上VerifyComplete()函数:
  1. function VerifyComplete()
  2. {
  3.     var controls = $(":input");
  4.     var verifyFlag = true;
  5.     $.each(controls, function(i, n) {
  6.         if(verifyFlag)
  7.             verifyFlag = Verify(n);
  8.     });
  9.     return verifyFlag;
  10. }


  11. function Verify(obj)
  12. {
  13.     var options;
  14.     $.each(verifyConfig, function(i, n) {
  15.         if(n.Id == obj.id)
  16.             options = n.Option;
  17.     });
  18.     
  19.     if(options == undefined)
  20.         return true;
  21.     
  22.     if(options.Empty != undefined && options.Empty.Flag == false)
  23.     {
  24.         if(!obj.value.isEmpty(options.Empty.Message))
  25.             return false;
  26.     }
  27.     if(options.Int != undefined)
  28.     {
  29.         if(!obj.value.isInt(options.Int.Message))
  30.             return false;
  31.     }
  32.     if(options.SafeString != undefined)
  33.     {
  34.         if(!obj.value.isSafeString(options.SafeString.Message))
  35.             return false;
  36.     }
  37.     
  38.     return true;
  39. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值