zoukankan      html  css  js  c++  java
  • jquery.validate的一个bug

    在用jquery.validate.js做输入验证中,用到了对某个字段重复性的判断,就是在某字段的验证中使用remote进行输入时用ajax不断向后台发送请求,但是奇怪的是,在你在data:{}中用name作为属性名,传到后台时,值丢了!?是的值没了,用的post方法,formdata里该属性为空,所以就无法进行验证了.解决方法就是改一下前台的属性名,可能jquery.validate这个插件的name是个关键字,不可以作为ajax的数据属性值。

    ---------------------------------2017-11-27-------------------------------------------------------

      我上述的推测是错误的,如果误导了一些朋友深感抱歉。与同事仔细探究了一番才发现,对某个input用remote输入验证时,不需要在data属性中指定这个input的value,因为源码中已经自动获取了该input的nam与value,并在封装的ajax中作为data中的参数传到后端,所以如果仅仅只是对此字段验证的话,data中可以什么都不需要写。

      下面是源码中对remote的描述:

     remote: function (value, element, param)//element指input的dom元素,value是被验证的值,param是remote对象
                {
                    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 (this.pending[element.name])
                    {
                        return "pending";
                    }
                    if (previous.old === value)
                    {
                        return previous.valid;
                    }//缓存设置
    
                    previous.old = value;
                    var validator = this;
                    this.startRequest(element);
                    var data = {};
                    data[element.name] = value;//这一步就是将dom元素的name和value作为data中的参数
                    $.ajax($.extend(true, {
                        url: param,
                        mode: "abort",
                        port: "validate" + element.name,
                        dataType: "json",
                        data: data,
                        success: function (response)
                        {
                            validator.settings.messages[element.name].remote = previous.originalMessage;
                            var valid = response === true;
                            if (valid)
                            {
                                var submitted = validator.formSubmitted;
                                validator.prepareElement(element);
                                validator.formSubmitted = submitted;
                                validator.successList.push(element);
                                validator.showErrors();
                            } else
                            {
                                var errors = {};
                                var message = response || validator.defaultMessage(element, "remote");
                                errors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;
                                validator.showErrors(errors);
                            }
                            previous.valid = valid;
                            validator.stopRequest(element, valid);
                        }
                    }, param));//这里将默认参数与我们在remote中写的参数进行合并,相同的属性后者覆盖
                    return "pending";
                } 
  • 相关阅读:
    最全的 Twitter Bootstrap 开发资源清单
    jQuery布局插件UI Layout简介及使用方法
    SQLcode错误代码汇总和sqlstate=37000的解决方案
    JQUERY插件学习之jQuery UI
    如何判断/检查一个集合(List<string>)中是否有重复的元素
    反射原理及简介
    C# 获取文件夹下的所有文件的文件名
    委托编程指南
    模块封装与程序集
    Redis Lock
  • 原文地址:https://www.cnblogs.com/amigod/p/7435609.html
Copyright © 2011-2022 走看看