validate是一个基于Jquery的表单验证插件,利用他的remote可以用来自定义远程验证,最近在项目中用到这个,但是在这当中遇到的几个问题,感觉让人很误解,下面我们来看例子。
这是要验证的表单:
- <form id="frm" name="frm" class="validateform">
- <p><label for="pinm86"> 品名:</label><input type="text" id="pinm86" name="pinm86" /></p>
- <p><label for="fangjianid78">房间号:</label><input type="text" id="fangjianid78" name="fangjianid78" /></p>
- </form>
这里我要验证品名的唯一性,如果输入品名重复就提示
下面是JS代码
- <script type="text/javascript">
- jQuery(document).ready(function($){
- $(".validateform").validate({
-
- rules:{
- pinm86:{
- required:true,
- remote:{
- url: "validateSbSbinfoData.action",
- type: "get",
- dataType: "json",
- data: {
- pinm86: function() {
- return $("#pinm86").val();
- }
-
- }
-
- }
- }
- },
- messages:{
- pinm86:{
- remote:"品名已经存在!"
- } }
-
-
- });
- });
- </script>
很多网上文章在只提到remote接受Json格式数据,然后就没有了,其实remote接受的返回值只要true和false即可,通过查看源代码可以发现,remote通过返回的false和true来判断的,那么就是说你后台程序只要返回true和false值,这点让我误解了许久。由于项目用到了Struts2,这是struts的配置文件,相信你不会陌生吧:
- <package name="json_sbSbinfo" extends="json-default">
- <action name="validateSbSbinfoData" class="sbSbinfoAction" method="validateData">
- <result name="success" type="json">
- <param name="defaultEncoding">UTF-8</param>
- <param name="root">resstr</param> 这里的resstr 就是Action里面对应的属性值
- </result>
- <result name="error" type="json"><param name="defaultEncoding">UTF-8</param></result>
- </action>
- </package>
这边有俩点要注意一下:1.因为Action里面要返回Json数据格式所以<package name="json_sbSbinfo" extends="json-default"> 这里的extends是“json-default” 而不是以往的“struts-default”。
2.要加上这个参数 <param name="root">resstr</param> 这里的resstr 就是Action里面对应的属性值
下面是sbSbinfoAction
- public class SbSbinfoAction extends ActionSupport implements ServletRequestAware,SessionAware {
-
- private boolean resstr;
-
-
- public String validateData()
- {
- String result = ERROR;
- String vcpinm=(String)this.request.getParameter("pinm86");
- Map map= new HashMap();
- map= sbSbinfoService.validateData(vcpinm);
- Object dd=map.get("n");
- String s=dd.toString();
- if(s.equals("0"))
- {this.resstr=true;}
- else
- {this.resstr=false;
-
- }
- result= SUCCESS;
- return result;
- }
-
-
- @JSON(serialize=false)
- public SbSbinfoService getSbSbinfoService() {
- return sbSbinfoService;
- }
-
-
-
- public boolean getResstr() {
- return resstr;
- }
-
- public void setResstr(boolean resstr) {
- this.resstr = resstr;
- }
-
-
- }
=====================================================================
jquery.validate.js作为前端开发的利器之一,深受广大前端工程师的喜爱,然而很多人却不善于利用remote,下面,对,就是下面,下面还有,我们来看看如何更合理的利用jQuery validate的remote。
介绍的内容主要有两点:
- 传统情况下,我们习惯使用addMethod方法为某个input提供后端验证机制,而不善于使用remote。
- 为remote方法提供附加的动态参数,比如你要验证昵称有没有被使用,你需要传递一下用户id。
- <script src="js/jquery.validate.js" type="text/javascript"></script>
第二步:注意remote源码,注意注释和附加参数!
- remote: function( value, element, param ) {
- if ( this.optional(element) ) {
- return "dependency-mismatch";
- }
-
-
- var previous = this.previousValue(element);
- if (!this.settings.messages[element.name] ) {
- this.settings.messages[element.name] = {};
- }
- previous.originalMessage = this.settings.messages[element.name].remote;
- this.settings.messages[element.name].remote = previous.message;
-
- param = typeof param === "string" && {url:param} || param;
-
- if ( previous.old === value ) {
- return previous.valid;
- }
-
- previous.old = value;
- var validator = this;
- this.startRequest(element);
- var data = {};
- data[element.name] = value;
-
-
- if($(element).attr("params")){
-
- var params = eval('(' + $(element).attr("params") + ')');
- for(var p in params){
- data[p] = params[p];
- }
- }
-
- $.ajax($.extend(true, {
- url: param,
- mode: "abort",
- type: "post",
- port: "validate" + element.name,
- dataType: "json",
- data: data,
- success: function( response ) {
- validator.settings.messages[element.name].remote = previous.originalMessage;
- var valid = response === true || response === "true";
- if ( valid ) {
- var submitted = validator.formSubmitted;
- validator.prepareElement(element);
- validator.formSubmitted = submitted;
- validator.successList.push(element);
- delete validator.invalid[element.name];
- validator.showErrors();
- } else {
- var errors = {};
- var message = response || validator.defaultMessage( element, "remote" );
- errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
- validator.invalid[element.name] = true;
- validator.showErrors(errors);
- }
- previous.valid = valid;
- validator.stopRequest(element, valid);
- }
- }, param));
- return "pending";
- }
第三步:页面上配置remote,请注意params属性!
- <input type="text" class="required alphanumeric" remote="${ctx}/jade/checkCodeIsExist.do" name="code"/>
- <input name="marketname" id="marketname" class="required" maxlength="50" params="{oldname:'${market.marketname}'}" type="text" value="${market.marketname}" remote="${ctx}/stocks_config/marketnameCheck.do" maxlength="10">
第四步:后台接收参数进行check,返回对应处理信息
注意:正常的时候返回true,检验不通过的时候返回错误提示信息
- @RequestMapping(value = "checkCodeIsExist")
- public void checkCodeIsExist(HttpServletRequest request, HttpServletResponse reponse) throws Exception {
- <span style="white-space:pre"> </span>Jadeinfo jadeinfo = this.jadeinfoDAO.selectByCodeKey(StrUtil.getUTF8String(request.getParameter("code")));
-
- if (jadeinfo != null && jadeinfo.getDeleteflag() == 0) {
- out("商品代码已存在!", reponse);
- } else {
- out(true, reponse);
- }
- }
第五步:one more thing!
来看看传统的addMethod方法,我觉得够麻烦的,对比一下remote,相形见绌哦!当然了,addMethod还是有其应用场景呢!
- jQuery.validator.addMethod("codeCheck", function(value, element) {
- $.ajax({
- url : common.ctx + "/jade/jade.do?action=checkCode",
- data : {
- code : value
- },
- async : false,
- dataType : 'json',
- success : function(records) {
- $("#checkcode").val(records);
- }
- });
- var result = $("#checkcode").val();
- if (result == "true") {
- return this.optional(element) || true;
- } else {
- return this.optional(element) || false;
- }
-
- }),
总结:最后呢,就附上一张效果图吧,也没啥!
![](https://img-blog.csdn.net/20141124173158574?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWluZ19nZWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)