即使不需要,jQuery验证插件添加方法仍在运行

时间:2013-03-15 05:42:06

标签: jquery jquery-validate

我正在使用jQuery Validation Plugin,我正在添加自己的方法:

jQuery.validator.addMethod("num", function(num) {
    if(isNaN(num))
        return false;

    return true;
}, "Please enter a valid number");

但是,即使我没有将required类添加到表单元素,如果用户没有输入任何内容,仍将调用此验证方法并将其评估为false。但我希望行为是,如果一个元素没有required类,只有在用户输入了某些内容时才会调用它。反正有没有这样做?谢谢!

更新

所以我上面发布的实际代码是一个简单的例子来演示这个问题,但是现在我提出的具体例子给了我一些问题。这是jsfiddle链接:

http://jsfiddle.net/SVwmH/2/

HTML

<form method="post">
    <li>
        <label for="2">Mileage</label>
        <input type="text" name="2" id="attr_2" class="non_neg_int"
        value="" />
    </li>
    <li>
        <label for="3">VIN (Vehicle Identification Number)</label>
        <input type="text" name="3"
        id="attr_3" class="vin" maxlength="17" value="" />
    </li>
    <li>
        <input type="submit" />
    </li>
</form>

JS

$(document).ready(function () {
    var validator = $("form").validate({
        onkeyup: false,
        onblur: true,
        ignore: "",
        submitHandler: function (form) { // for demo
            alert('valid form submitted'); // for demo
            return false; // for demo
        }
    });
});

jQuery.validator.addMethod("vin", function (vin) {
    if (!(/^[A-HJ-NP-Z0-9]{17}$/.test(vin))) return false;
    return true;
}, "Must be a valid VIN");

jQuery.validator.addMethod("non_neg_int", function (non_neg_int) {
    if (isNaN(non_neg_int) || non_neg_int == null || non_neg_int == "" || non_neg_int < 0 || !is_int(non_neg_int)) return false;

    return true;
}, "Must be a nonnegative integer");

function is_int(value) {
    if ((parseFloat(value) == parseInt(value)) && !isNaN(value)) {
        return true;
    } else {
        return false;
    }
}

1 个答案:

答案 0 :(得分:5)

引用OP

  

“但是,即使我没有将required类添加到表单元素,   如果,则仍将调用此验证方法并将其评估为false   用户没有输入任何内容。“

我无法像你描述的那样重现这个问题。

发布时,空字段不会调用您的自定义方法,也不需要字段。

DEMO:http://jsfiddle.net/mJvA8/

<强> HTML

<form id="myform">
    <input type="text" name="field1" />
    <input type="submit" />
</form>

<强>的jQuery

$(document).ready(function () {

    jQuery.validator.addMethod("num", function (num) {
        if (isNaN(num)) return false;
        return true;
    }, "Please enter a valid number");

    $('#myform').validate({ // initialize the plugin
        rules: {
            field1: {
                num: true
            }
        }
    });

});

编辑基于已修改的OP:

我发现您的代码存在以下问题。只有其中一些项目破坏了您的代码。其余的只是一个良好的实践问题。您可以一次测试这些,以便自己查看。

1) 没有名为 onblur的选项。有一个名为onfocusout,默认情况下启用 。如果你将true传递给它,你就会打破它。您只能通过false来禁用它,或者传递自定义功能来覆盖它。要启用默认的onfocusout选项,请完全将其保留。

2)每个输入元素必须具有有效namename="2"无效。它不能以数字开头。

3)如果您要验证任何隐藏字段,ignore选项必须设置为ignore: []而不是ignore: ""。否则,请保留此选项,默认情况下将忽略隐藏字段。请参阅:https://stackoverflow.com/a/8565769/594235

4)我不明白在每个元素上指定value=""的意义。如果您不使用,请简单地省略value属性。

5)而不是写出所有这些......

 if (test) return false;
 return true;

...您可以更简单地写一个短行:return !(test); (我只是添加了!来将您的特定test逻辑翻转为return false,就像你写的那样。)

6) As per documentation,您只需将valueelement和可选的params传递到customMethod函数中,如下所示:{{1 }}

这种语法减轻了任何混淆。此外,使用规则的名称.addMethod("myrule", function(value, element, params) { ... }, "message")代替单词"non_neg_int"完全违反了"value"自定义方法。

如果您不希望这些规则是“必需的”,那么您必须修复规则中的逻辑。例如,non_neg_int方法正在查找空字段或空字段,因此当字段为空时,它会给出错误消息。

在这两条规则中,我只添加了non_neg_int,这使得规则可选。换句话说,如果将其留空,则规则将不执行任何操作。

this.optional(element)

下面有一个工作演示,您可以根据需要进行调整。

新演示:http://jsfiddle.net/gVVa8/