jquery.validator验证问题

正常情况下依次验证是没有问题的
当用户名失去焦点时验正用户名已存在成功!

[img]http://dl.iteye.com/upload/attachment/382283/39823f26-7767-3914-9262-f8444fdbe190.jpg[/img]

但如果先填写用户名与密码再去选择客户结果是验证通过,插入的相同的数据

[img]http://dl.iteye.com/upload/attachment/382305/6027d801-9e73-3b88-a532-a7141ffb18cc.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/382307/dce0a13e-77dd-3b34-8c3e-dfc5b40165e5.jpg[/img]

请问可以在点提交时重新验证所有的状态吗?

[quote]我的页面的的ID是name 你说这地方是用的id还是什么?[/quote]

传入去的值应该是一个选择器,如"#name",实际上它会这样用 $("#name")[0]。

[code="javascript"]var validator = $("#form").validate({
});[/code]

validator.element("#name"); // 这样是可以的。 注意前面要是你的validate定义的返回值。

在选择客户时,触发用户名验证就可以了。

假设 客户的 ID 为 customer , 用户名的 ID 为 username 。
[code="javascript"]
var validateForm = $("#form").validate({
// ........
});

$("#customer").change(function(){
validateForm.element("#username");
});
[/code]

可以,在没有提交表单的情况下,可以使用valid()方法进行验证

[code="javascript"]
/**
* 页面加载完毕后执行操作
*/
$(function() {
addValidate();
});

/**
 * 为字段添加验证
 */
function addValidate() {
    $("#baseKeyForm").validate({
        rules : {
            "socketBaseKey" : { required : true, equalLength : 24 },
            "soapBaseKey" : { required : true, equalLength : 24 },
            "socketBaseKey2" : { required : true, equalTo : "#socketBaseKey" },
            "soapBaseKey2" : { required : true, equalTo : "#soapBaseKey" }
        }
    });
}

/**
 * 保存
 */
function save(){
    // 手工验证表单, 使用验证插件的valid()方法
    if (!$("#baseKeyForm").valid()) return false;
    alert("验证通过!");
}

[/code]

// 手工验证表单, 使用验证插件的valid()方法

if (!$("#baseKeyForm").valid()) return false;

[quote]依照您的方法后还是验正通过的状态,它只能验证文本框是否输入正确无法验正是否存在![/quote]

把你的完整验证方法贴出来看看。 应该是你传回后台验证的参数不对。

我理解错你的意思,你应该在下拉框、输入框的值改变的时候,用jQuery的Ajax到后面验证一下

下面这段代码可以实现你的需求:

[code="javascript"]
/**

  • 添加一个用户验证用户名的验证方法 */ jQuery.validator.addMethod("checkUserName", function(value, element, params) { var url = "用户验证用户名的URL"; $.post(url, params, function(data){
    if (data == true) { return true; // 验证通过 } return false; }); }, jQuery.validator.format("该用户下的此用户名已存在"));

/**

  • 为表单属性添加验证方法 */ $("#userForm").validate({ rules : { "customerId" : { required : true, checkUserName : {customerId: $("#customerId").val(), userName: $("#userName").val()} }, // 客户ID "userName" : { required : true, checkUserName: checkUserName : {customerId: $("#customerId").val(), userName: $("#userName").val()}} // 用户名 } }); [/code]

"user.username" 有一个 remote 校验。

当 "user.username" 的值不改变时,不会校验二次 remote。也就是想所属客户改变但用户名没有改变时,要重新校验remote须改源代码(源代码里做了优化,不校验二次一样的,这其实也算是一个bug)。

源代码如下:
[code="javascript"]
// http://docs.jquery.com/Plugins/Validation/Methods/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 ) { // 就是这里的错,你把这一行及后面对应的 } 删了就行了。
    previous.old = value;
    var validator = this;
    this.startRequest(element);
    var data = {};
    data[element.name] = value;
    $.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 = (previous.message = response || validator.defaultMessage( element, "remote" ));
                errors[element.name] = $.isFunction(message) ? message(value) : message;
                validator.showErrors(errors);
            }
            previous.valid = valid;
            validator.stopRequest(element, valid);
        }
    }, param));
    return "pending";
} else if( this.pending[element.name] ) {
    return "pending";
}
return previous.valid;

},
[/code]

[quote]是可以在提交的时候再次验证是否存在,但是在正确的情况下无法提交表单阿!请问是那里出问题了吗?[/quote]

这么神奇? 这样改试下:
[code="javascript"]
// http://docs.jquery.com/Plugins/Validation/Methods/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 ) { // 就是这里的错,你把这一行及后面对应的 } 删了就行了。  
    previous.old = value;  
    var validator = this;  
    this.startRequest(element);  
    var data = {};  
    data[element.name] = value;  
    $.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 = (previous.message = response || validator.defaultMessage( element, "remote" ));  
                errors[element.name] = $.isFunction(message) ? message(value) : message;  
                validator.showErrors(errors);  
            }  
            previous.valid = valid;  
            validator.stopRequest(element, valid);  
        }  
    }, param));  
//    return "pending";  
//} else if( this.pending[element.name] ) {  
//    return "pending";  
//}  
return previous.valid;  

},

[/code]

[quote]依然不行阿`点提交后没反应了 把这样还原就可以提交。这是为什么呢?[/quote]
不好调试,郁闷,这样可以了吧:
[code="javascript"]
// http://docs.jquery.com/Plugins/Validation/Methods/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 ) { // 就是这里的错,你把这一行及后面对应的 } 删了就行了。    
    previous.old = value;    
    var validator = this;    
    this.startRequest(element);    
    var data = {};    
    data[element.name] = value;    
    $.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 = (previous.message = response || validator.defaultMessage( element, "remote" ));    
                errors[element.name] = $.isFunction(message) ? message(value) : message;    
                validator.showErrors(errors);    
            }    
            previous.valid = valid;    
            validator.stopRequest(element, valid);    
        }    
    }, param));    
    return "pending";    
//} else if( this.pending[element.name] ) {    
//    return "pending";    
//}    
return previous.valid;    

},

[/code]

看来不简单哦,呵~ 换种方式了,不改源码了。
[code="javascript"]
var validateForm = $("#form").validate({

// ........

});

$("#customer").change(function(){
var value = $("#username");
$("#username").val("--y==a--");
validateForm.element("#username");

$("#username").val(value);
validateForm.element("#username");
});

[/code]
:D

[code="javascript"]
$("#clientId").change(function(){

var value = $("#name");

$("#name").val("");

});

[/code]

这样用户不会有意见吗? 输入了用户名却不见了。

我觉还是先改变一下值,触发校验,再自动改回来较好。

[code="javascript"]
$("#clientId").change(function(){

var value = $("#name");

$("#name").val("");
validate.element("#username");
$("#name").val(value);

validate.element("#username");
});

[/code]

[quote]你这样写变成空值后就变不回来了阿!![/quote]

写错了。

$("#clientId").change(function(){

var value = $("#name").val(); // 忘了写val()了,呵

$("#name").val("");

validate.element("#username");

$("#name").val(value);

validate.element("#username");

});

[code="javascript"]
$("#clientId").change(function(){

var value = $("#name").val(); // 忘了写val()了,呵

$("#name").val("");

validate.element("#name");

$("#name").val(value);

validate.element("#name");

});
[/code]