我正在创建一个ASP.NET Core Web应用程序,它使用jQuery Validate进行客户端验证,jQuery Unobtrusive Validation使用HTML5 data- *属性配置验证。我有一个文本输入,我通过事件委托处理它的blur
事件。代码看起来像这样:
$(document).ready(() => {
$('#my-container').on('blur', '.my-input-class', (event) => {
var isValid = $(event.target).valid();
// Do stuff with isValid's boolean value
});
});
不幸的是,如果我在输入中输入了无效值,然后选项卡输出,则isValid
仍会设置为true
。但是,如果我点击输入并再次点击关闭,则第二次模糊事件会将isValid
正确设置为false
。
我认为我的模糊处理程序在jQuery Validate模糊处理程序之前发生,可能是因为我使用事件委派而不是直接处理input.onblur()
。事件委托是必要的,因为输入是在已经调用validate()
之后动态生成的。我发现有些帖子建议调用validator.element()
,但由于ASP.NET Core使用不显眼的验证库,因此我永远无法访问validate()
返回的验证程序对象。所以......
TL; DR
在使用不显眼的验证库时,如何确保valid()
在委派的事件处理程序中返回正确的值?
编辑
在修改我的网页HTML以便发布时,我知道问题可能是什么。我的输入实际上是使用带有data-val-remote
属性的remote validation。也许我的模糊处理程序只是在远程验证发送响应之前被调用,所以插件认为输入仍然有效?
答案 0 :(得分:0)
看起来问题确实是将远程验证与模糊处理程序混合使用。从那以后,我开始使用更多事件驱动的方法进行验证。
$.validator.setDefaults({
highlight: (element, errorClass, validClass) =>
onValidating(element, false, errorClass, validClass),
unhighlight: (element, errorClass, validClass) =>
onValidating(element, true, errorClass, validClass)
});
function onValidating(element, valid, errorClass, validClass) {
var e = new CustomEvent("validating", {
detail: {
valid: valid,
errorClass: errorClass,
validClass: validClass
},
bubbles: true
});
element.dispatchEvent(e);
}
为jQuery Validate的setDefaults()
方法提供的highlight
和unhighlight
回调每个都会引发一个合成validating
事件,valid
属性设置为{{1分别是}或false
。然后,可以将这些事件订阅到应用程序中的任何其他位置,从而允许将true
操作移动到这些新处理程序。就我而言:
onblur
因为这种技术使用setDefaults()而不是validate(),所以它可以与ASP.NET Core的不显眼的验证插件一起使用!
答案 1 :(得分:-1)
您正在使用event.target
...
你应该控制它.log它。我非常确定在输入外的click
,但在form
内,验证工作正常。
但是在" tab-out",我猜这意味着 TAB keypress ...事件中没有target
属性。
所以只需改变:
$(document).ready(() => {
$('#my-container').on('blur', '.my-input-class', (event) => {
var isValid = $(this).closest("form").valid();
// Do stuff with isValid's boolean value
});
});