如何将变量传递给jQuery验证

时间:2014-11-19 19:53:42

标签: javascript jquery jquery-validate

建立this SO question,我试图将两个变量传递给自定义验证器方法。使用console.log我可以看到上面的&较低的范围是在HTML中定义的,但未正确传递给选项,而是取而代之的是NaN

问题似乎是两个文本框的值尚未定义或设置(当它们在下面的验证规则中发送时),但是当它们到达验证器时(这只是一个猜测,我还没有能够在验证尝试之前想出一种方法来嗅探它们的值。因此,如果我将它们记录在验证器方法中,它们会显示正常,但如果我将它们作为变量传递,它们会在PCBID对象(Chrome浏览器)中显示为NaN:

Object {PCBID: Object}
    PCBID: Object
        lower: NaN
        upper: NaN
    __proto__: Object
    __proto__: Object

这里是验证器,还有其他规则可以防止输入整数,因此不应该出现问题:

//this validator checks to make sure the user has entered the PCBIDs in 
//the correct order in the range form.
$.validator.addMethod("highLowCheck", function (value, element, options)
{
console.log("Inside highLowCheck validator");
console.log(parseInt($('#pcbid_range_lower').val(),10)); //shows expected values
console.log(parseInt($('#pcbid_range_upper').val(),10)); //shows expected values

console.log(options.PCBID.upper); //NaN
console.log(options.PCBID.lower); //NaN
//evaluates to false because NaN is falsey
console.log(options.PCBID.upper > options.PCBID.lower); 
console.log("Done logging");
return options.PCBID.upper > options.PCBID.lower;
}
);

以下是我试图传递的变量:

            pcbid_range_upper: {
            required: true,
            digits: true,
            rangelength: [3, 6],
            highLowCheck:
            { PCBID:
                {
                    //this doesn't work                        
                    lower: parseInt($('#pcbid_range_lower').val(),10), 
                    upper: parseInt($('#pcbid_range_upper').val(),10)
                }
            },

如果我传递这样的原始值:

            highLowCheck:
            { PCBID:
                {
                    lower: 1000, //works
                    upper: 2000
                }
            },

这种方法有效,但它不是很有用,因为用户可以输入他们喜欢的任何值,所以我必须能够将它们作为变量传递。我还需要这个来处理变量,因为我需要从多个验证例程调用它,否则我只是直接使用验证器中的变量(因为我需要多个表单才能使用验证器)。

如果它有用,这里是两个输入的HTML:

<div data-role="fieldcontain" data-controltype="textinput" class="pcbid_selections" tabindex="2">
    <label for="pcbid_range_lower">Starting PCBID *</label>
    <input name="pcbid_range_lower" id="pcbid_range_lower" class="create_group" placeholder="52759" value="" type="text" data-mini="true" />
</div>
<div data-role="fieldcontain" data-controltype="textinput" class="pcbid_selections" tabindex="3">
    <label for="pcbid_range_upper">Ending PCBID *</label>
    <input name="pcbid_range_upper" id="pcbid_range_upper" class="create_group" placeholder="52769" value="" type="text" data-mini="true">
</div>

问题: 如何将规则内的变量传递给自定义验证器?

修改

解决方案:感谢@Sparky&amp; Mathletics

验证器方法已更改为仅接收我想传递的两个变量的名称的字符串,而不是其内容。然后使用@ Mathletic的建议,我只需将它们放入jQuery变量形式里面验证器:

//this validator checks to make sure the user has entered the PCBIDs in the 
//correct order in the range form.
$.validator.addMethod("highLowCheck", function (value, element, options){
return parseInt($('#' + options.PCBID.upper).val(), 10) > 
       parseInt($('#' + options.PCBID.lower).val(), 10);
}
);

并从规则中调用它们:

highLowCheck:
    {
        PCBID:
        {
            lower: 'pcbid_range_lower',
            upper: 'pcbid_range_upper'
        }
    },

对于任何发现这一点的人来说,只是一个FYI,我尝试用规则中的字符串(#:'#pcbid_range_lower')传递英镑符号(&#34;#&#34;)但是没有&# 39;似乎工作。这个方法可以,你只需要预先添加&#34;#&#34;在验证器方法中,而不是很好。

1 个答案:

答案 0 :(得分:4)

引用OP

  

&#34;问题:如何将规则中的变量传递给自定义验证器?&#34;

.validate() ...

中声明
rules: {
    myField: {
        customMethod: [1, "two", 3, "foo"]
    }
}

customMethod已定义...

$.validator.addMethod("customMethod", function (value, element, options) {
    console.log(options[0]);      // <- 1
    console.log(options[1]);      // <- "two"
    console.log(options[2]);      // <- 3
    console.log($('[name=' + options[3] + ']').val()); // <- value of field named "foo"
    console.log(value);      // <- the value of "myField"
    console.log(element);    // <- the "myField" object
    // your function
}, "Custom message with options used as {0}, {1}, {2}, {3} etc.");

DEMO:http://jsfiddle.net/pupggbu7/

文档:http://jqueryvalidation.org/jQuery.validator.addMethod/