首页 > 解决方案 > 试图让 jquery 验证中的 addMethod 工作。console.log 显示正确的响应,但始终无法通过验证

问题描述

我正在为 jQuery Validation 插件使用数据属性。我需要使用“远程”验证功能,但是,我需要根据使用的表单修改发送到远程位置的数据。我想使用数据属性而不是<script>为每个表单创建调用。

我创建了一个自定义$.validator.addMethod来处理这个问题,但是每次我运行它时,表单都会像返回一样返回false。我添加了一个调用,console.log()以确保数据返回truefalse基于远程脚本返回,并且确实如此。true它应该在什么时候返回,什么false时候应该返回。

这是我的自定义添加方法:

$.validator.addMethod("dupcheck", function(value,element){
    var method = element.getAttribute("data-method");
    var data = { "dupcheckv" : value, "dupcheckm" : method };
    $.post( "duplicate-check.php", data).done(function(response){
        console.log(response);
        return response;
    });
});

我确实看过如何使 jquery “$.post” 请求同步 [duplicate] ,但async:false已被弃用,因此无济于事。

标签: javascriptjqueryjquery-validate

解决方案


我通过复制所有remote函数并将其放入addMethod调用中使其工作:

$.validator.addMethod("dupcheck", function(value, element, param, method){
    if ( this.optional( element ) ) {
        return "dependency-mismatch";
    }

    method = typeof method === "string" && method || "dupcheck";

    var previous = this.previousValue( element, method ),
        validator, data, optionDataString;

    if ( !this.settings.messages[ element.name ] ) {
        this.settings.messages[ element.name ] = {};
    }
    previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
    this.settings.messages[ element.name ][ method ] = previous.message;

    param = typeof param === "string" && { url: param } || param;
    optionDataString = $.param( $.extend( { data: value }, param.data ) );
    if ( previous.old === optionDataString ) {
        return previous.valid;
    }

    previous.old = optionDataString;
    validator = this;
    this.startRequest( element );
    data = {};
    data[ "dupcheckv" ] = value;
    data[ "dupcheckm" ] = element.getAttribute("data-method");
    $.ajax( $.extend( true, {
        mode: "abort",
        port: "validate" + element.name,
        dataType: "json",
        method: "POST",
        data: data,
        context: validator.currentForm,
        success: function( response ) {
            var valid = response === true || response === "true",
                errors, message, submitted;

            validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
            if ( valid ) {
                submitted = validator.formSubmitted;
                validator.resetInternals();
                validator.toHide = validator.errorsFor( element );
                validator.formSubmitted = submitted;
                validator.successList.push( element );
                validator.invalid[ element.name ] = false;
                validator.showErrors();
            } else {
                errors = {};
                message = response || validator.defaultMessage( element, { method: method, parameters: value } );
                errors[ element.name ] = previous.message = message;
                validator.invalid[ element.name ] = true;
                validator.showErrors( errors );
            }
            previous.valid = valid;
            validator.stopRequest( element, valid );
        }
    }, param ) );

    return "pending";
});

推荐阅读