验证方法返回true而不是false

时间:2015-09-14 09:43:55

标签: jquery ajax jquery-validate

我正在创建一个jQuery验证方法,我在二维字段(宽度和高度)上使用它。用户可以选择在页面上的选择框中使用毫米或英寸。这些字段验证了以下几点:

  • 最大。 980毫米
  • 最小。 100毫米
  • 如果两个场中的一个超过860mm,则另一个可能不会更多 比860mm。

工作原理: 当一个字段正在使用时,将使用该字段的值完成ajax调用。该值进入PHP函数,将其转换为以毫米为单位的大小。这样可以以毫米为单位给出正确的结果。

当此值(以毫米为单位)返回时,它会通过一些条件语句来检查验证点。然后将结果变量设置为true或false,最后脚本返回它。

问题: 当我将我的大小设置为“英寸”时,我用38(965,19mm)填充第一个字段,第二个字段也填充到38,脚本返回true。这不应该发生,因为我的if语句说如果一个字段超过860mm,另一个字段可能不超过860mm。奇怪的是,使用毫米大小,一切都正常..

我的Javascript:

/** Dimension restrictions validator method */
jQuery.validator.addMethod( 'restrictions', function(value, element) {

    // Set variables
    var result = true;
    var message = '';
    var other = $(element).parents().siblings('.input-group').find('.dimension-field').val();   
    var mUnit = $('#size_data option:selected').val(); 

    // Do ajax call to get millimeters
    $.ajax({
        url: sbt.ajaxurl,
        async: false,
        data: { action: 'sbt_mm_value', value: value, mu: mUnit },
        success: function(data) {

            // Smaller than 980
            if(data <= 980) {

                // Bigger than 100                                  
                if(data >= 100) {
                    result = true;
                } else {
                    result = false;

                    if(mUnit == 'in') {
                        message = sbt.msg.restrictions.minimum + ' 3.93in';
                    } else {
                        message = sbt.msg.restrictions.minimum + ' 100mm';
                    }
                }

                // Bigger than 860
                if(data > 860) {

                    // Other field smaller than or equal than 860
                    if(other <= 860) {
                        result = true;
                    } else {
                        result = false;
                        if(mUnit == 'in') {
                            message = sbt.msg.restrictions.maximum + ' 33.85in';    
                        } else {
                            message = sbt.msg.restrictions.maximum + ' 860mm';  
                        }
                    }
                } 

                // Smaller than or equal to 860
                if(data <= 860) {

                    // Other field smaller than or equal than 980
                    if(other <= 980) {
                        result = true;  
                    } else {
                        result = false;
                        if(mUnit == 'in') {
                            message = sbt.msg.restrictions.maximum + ' 33.85in';    
                        } else {
                            message = sbt.msg.restrictions.maximum + ' 860mm';  
                        }
                    }
                }

            } else {
                result = false;
                if(mUnit == 'in') {
                    message = sbt.msg.restrictions.maximum + ' 38.58in';    
                } else {
                    message = sbt.msg.restrictions.maximum + ' 980mm';  
                }
            }


        }
    });

    // Set message
    $.validator.messages.restrictions = message;

    // Return true or false
    return result;

});

将该方法应用于字段:

$('#action_form').validate({
    rules: {
        width_data: { 
            required: true,
            restrictions: true,

        },
        height_data: { 
            required: true,
            restrictions: true,
        },
    },
});

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。问题是由于其他字段值未转换为毫米而引起的。这就是为什么它可以选择尺寸而不是英寸的毫米,因为毫米已经是毫米,但不是英寸。

/** Dimension restrictions validator method */
jQuery.validator.addMethod( 'restrictions', function(value, element) {

    // Gets selected size
    var mUnit   = $('#size_data option:selected').val(); 

    // Gets values of both fields
    var otherField  = $(element).parents().siblings('.input-group').find('.dimension-field').val().toString();  
    var thisField   = value.toString();

    // Set default variables
    var result  = true;
    var message     = '';

    /** Does AJAX call to get millimeters and does checks */
    $.ajax({
        url: sbt.ajaxurl,
        async: false,
        data: { action: 'sbt_mm_value', mu: mUnit },
        success: function(data) {

            // Gets one unit in millimeters
            var multiply = data.toString();

            // Get millimeter values
            var value = thisField * multiply;
            var other = otherField * multiply;

            //console.log('Value = ' + value + ' and other is '+ other);

            // Smaller than 980
            if(value <= 980) {

                // Greater than 100                                 
                if(value >= 100) {
                    result = true;
                } else {
                    result = false;

                    if(mUnit == 'in') {
                        message = sbt.msg.restrictions.minimum + ' 3.93in';
                    } else {
                        message = sbt.msg.restrictions.minimum + ' 100mm';
                    }
                }

                // Greater than 860
                if(value > 860) {

                    // Other field smaller than or equal than 860
                    if(other <= 860) {
                        result = true;
                    } else {
                        result = false;
                        if(mUnit == 'in') {
                            message = sbt.msg.restrictions.maximum + ' 33.85in';    
                        } else {
                            message = sbt.msg.restrictions.maximum + ' 860mm';  
                        }
                    }
                } 

                // Smaller than or equal to 860
                if(value <= 860) {

                    // Other field smaller than or equal than 980
                    if(other <= 980) {
                        result = true;  
                    } else {
                        result = false;
                        if(mUnit == 'in') {
                            message = sbt.msg.restrictions.maximum + ' 33.85in';    
                        } else {
                            message = sbt.msg.restrictions.maximum + ' 860mm';  
                        }
                    }
                }

            } else {
                result = false;
                if(mUnit == 'in') {
                    message = sbt.msg.restrictions.maximum + ' 38.58in';    
                } else {
                    message = sbt.msg.restrictions.maximum + ' 980mm';  
                }
            }


        }
    });

    // Set message
    $.validator.messages.restrictions = message;

    // Return true or false
    return result;

});