Javascript 即使名称正确,jQuery验证自定义验证器也未激发
我有以下代码: HTML: 问题很简单:我的自定义验证器方法从未被调用 我在这里读过几个关于StackOverflow的类似问题和答案(例如),但它们似乎都不起作用。事实上,恰恰相反。大多数人建议jQuery验证器通过查找具有指定名称而不是指定id的输入字段来工作。也就是说,Javascript 即使名称正确,jQuery验证自定义验证器也未激发,javascript,jquery,jquery-validate,unobtrusive-validation,Javascript,Jquery,Jquery Validate,Unobtrusive Validation,我有以下代码: HTML: 问题很简单:我的自定义验证器方法从未被调用 我在这里读过几个关于StackOverflow的类似问题和答案(例如),但它们似乎都不起作用。事实上,恰恰相反。大多数人建议jQuery验证器通过查找具有指定名称而不是指定id的输入字段来工作。也就是说,(*)处的对象属性名称必须与要验证的输入的名称属性匹配。但是,正如您在我的代码中所看到的,我的输入中确实有test\u txb名称(以及id),但由于某些原因,我的验证程序方法从未使用上述代码调用 但是,如果我将验证器方法的
(*)
处的对象属性名称必须与要验证的输入的名称
属性匹配。但是,正如您在我的代码中所看到的,我的输入中确实有test\u txb
名称(以及id),但由于某些原因,我的验证程序方法从未使用上述代码调用
但是,如果我将验证器方法的名称(testValidationMethod
)作为类添加到我的输入字段中,那么它确实会被调用。这听起来与我在这里读到的内容相矛盾,因为所有这些答案都表明默认行为是验证器在设置自定义验证规则时检查元素的name
属性
那么这里发生了什么,有人能解释一下吗?最简单的解决方案当然是只添加前面提到的类名,但我讨厌在代码中乱扔不必要的东西,尤其是当我不完全理解为什么要这样做的时候
编辑:jQuery验证程序版本为1.15.1
编辑2:我还引用了ASP.NET MVC Unobtrusive lib,这可能与某些内容相冲突?您是否添加了用于jquery验证的插件 因为我在codepen中复制/粘贴您的解决方案时没有问题 编辑:我认为你应该有一个验证器的返回值 编辑2:关于你的编辑,我在谷歌上搜索了一下,发现了一些有趣的东西,链接如下:
您可能忘记了包含验证或jQuery的
js
这是你的工作代码
html
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.15.1/additional-methods.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.15.1/jquery.validate.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<form id="myTestFrom">
<input type="text" name="test_txb" id="test_txb" value="" class="form-control" />
</form>
查看验证程序插件的源代码后,我发现问题是由以下几行代码引起的:
// 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
});
是的,我已经添加了,否则我甚至无法引用
$
上的validator字段。关于返回值,我也尝试过这样做,但它仍然没有被调用,添加返回值并不能解释为什么在我添加所提到的类名时它会被调用。您不能多次调用.validate()
。由于unobtrusive已经构造并调用了.validate()
,所以您的实例被完全忽略。叮,叮,叮。。。。您的“编辑2”是根本原因。不能多次调用.validate()
。由于unobtrusive会自动构造和调用.validate()
,因此您的实例将被完全忽略。
$(document).ready(function(){
$.validator.addMethod('testValidationMethod', function(value, element) {
console.log('FIRED');
}, 'test error message');
$('#myTestFrom').validate({
rules: {
test_txb: {
required: true,
testValidationMethod: true
}
}
});
});
// Check if a validator for this form was already created
var validator = $.data( this[ 0 ], "validator" );
if ( validator ) {
return validator;
}
$('#test_txb').rules('add', {
testValidationMethod: true
});