我正在使用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链接:
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;
}
}
答案 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)每个输入元素必须具有有效name
,name="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,您只需将value
,element
和可选的params
传递到customMethod函数中,如下所示:{{1 }}
这种语法减轻了任何混淆。此外,使用规则的名称.addMethod("myrule", function(value, element, params) { ... }, "message")
代替单词"non_neg_int"
完全违反了"value"
自定义方法。
如果您不希望这些规则是“必需的”,那么您必须修复规则中的逻辑。例如,non_neg_int
方法正在查找空字段或空字段,因此当字段为空时,它会给出错误消息。
在这两条规则中,我只添加了non_neg_int
,这使得规则可选。换句话说,如果将其留空,则规则将不执行任何操作。
this.optional(element)
下面有一个工作演示,您可以根据需要进行调整。