我有以下代码:
HTML:
<form id="myTestFrom">
<input type="text" name="test_txb" id="test_txb" value="" class="form-control" />
</form>
JS:
$(function () {
$.validator.addMethod('testValidationMethod', function (value, element) {
alert('FIRED');
}, 'test error message');
$('#myTestFrom').validate({
rules: {
/* (*) */
test_txb: { testValidationMethod: true }
}
});
});
问题很简单:我的自定义验证器方法从未被调用。
我在 StackOverflow 上阅读了几个类似的问题和答案(例如 this ),但它们似乎都不起作用。事实上,恰恰相反。他们中的大多数建议 jQuery 验证器通过查找具有指定 name 而不是指定 id 的输入字段来工作。也就是说,(*)
处的对象属性名称必须与要验证的输入的 name
属性相匹配。但是,正如您在我的代码中看到的那样,我的输入中确实有 test_txb
名称(以及 id),但出于某种原因,我的验证器方法从未得到使用上面的代码调用。
但是,如果我将验证器方法的名称 (testValidationMethod
) 作为一个 class 添加到我的输入字段中,它就会被调用。这听起来与我在此处阅读的有关 SO 的内容自相矛盾,因为所有这些答案都表明默认行为是验证器在设置自定义验证规则时检查元素的 name
属性。
那么这是怎么回事,有人可以解释一下吗?最简单的解决方案当然是只添加前面提到的类名,但我讨厌在我的代码中乱扔不必要的东西,尤其是当我不完全理解为什么要这样做的时候。
编辑 jQuery 验证器版本为 1.15.1
编辑 2: 我还引用了 ASP.NET MVC Unobtrusive lib,也许这与某些内容冲突?
最佳答案
在查看验证器插件的源代码后,我发现问题是由以下几行引起的:
// Check if a validator for this form was already created
var validator = $.data( this[ 0 ], "validator" );
if ( validator ) {
return validator;
}
因此,此处发布的任何答案都表明他们可以使其正常工作的原因是他们自己初始化了验证器。可能我得到了这种奇怪的行为,因为 ASP.NET 不显眼的库默默地初始化了验证器,因此即使我将我的规则传递给 validate
方法,也没有添加任何东西,我得到了预配置的验证器对象(呃,自动化的缺点...)。
我终于通过像这样使用初始化后规则添加让它工作了:
$('#test_txb').rules('add', {
testValidationMethod: true
});
关于javascript - 即使名称正确,jQuery 验证自定义验证器也未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40605780/