Javascript jQuery valid()在委托模糊处理程序中给出了错误的值

Javascript jQuery valid()在委托模糊处理程序中给出了错误的值,javascript,jquery,validation,asp.net-core,Javascript,Jquery,Validation,Asp.net Core,我正在创建一个ASP.NET核心web应用程序,用于客户端验证,并使用HTML5数据-*属性配置验证。我有一个文本输入,我通过事件委托处理它的blur事件。代码如下所示: $(document).ready(() => { $('#my-container').on('blur', '.my-input-class', (event) => { var isValid = $(event.target).valid(); // Do stuff

我正在创建一个ASP.NET核心web应用程序,用于客户端验证,并使用HTML5数据-*属性配置验证。我有一个文本输入,我通过事件委托处理它的
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验证模糊处理程序之前出现的,可能是因为我使用的是事件委派,而不是直接处理
input.onblur()
。不过,事件委派是必要的,因为输入是在调用之后动态生成的。我看到一些帖子建议调用,但由于ASP.NET Core使用了不引人注目的验证库,因此我永远无法访问
validate()
返回的validator对象。所以

TL;DR

如何确保在使用不引人注目的验证库时,在委托事件处理程序中返回正确的值

编辑


在整理页面的HTML以便发布时,我想到了问题所在。我的输入实际上与
data val remote
属性一起使用。也许在远程验证发送响应之前,我的模糊处理程序刚刚被调用,因此插件认为输入仍然有效?

您使用的是
事件.target

你应该把它记录下来。我很确定,在
上单击输入外部的
但在
表单内部的
验证正在工作

但在“tab out”中,我猜这意味着tab键按下。。。事件中没有
target
属性

所以只要改变一下:

$(document).ready(() => {
    $('#my-container').on('blur', '.my-input-class', (event) => {
        var isValid = $(this).closest("form").valid();
        // Do stuff with isValid's boolean value
    });
});

看起来问题确实是混合了远程验证和模糊处理程序。从那以后,我开始使用更为事件驱动的方法进行验证

$.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方法的
高亮显示
取消高亮显示
回调都会引发一个合成的
验证
事件,其中
有效
属性分别设置为
。然后,这些事件可以订阅到应用程序中的任何其他位置,允许用户将
onblur
操作移动到这些新处理程序。就我而言:

$('#my-container').on('validating', e => {
    var isValid = e.detail.valid;
    // Do stuff with isValid's boolean value
});

因为此技术使用setDefaults()而不是,所以它可以与ASP.NET Core的不引人注目的验证插件一起使用

您是否尝试过
change
事件,甚至是
input
事件?我刚刚尝试过。对于这两个事件,
isValid
实际上是
true
无论我输入什么!是的,tab指的是tab(我不知道你们可以在这里使用键盘符号!)。我只是试着点击TAB,在表单内点击关闭,在表单外点击关闭,但是看起来好像
e.target
总是被定义的。无论我是在表单上还是在输入中调用
valid()
,我在第一次模糊时仍然会得到
true
的无效值。发布你的HTML然后。。。生产的HTML请!这将使你的问题,也许我将能够回答不同。如果
.valid()
是一个自定义命名函数,也可以发布它。在整理页面的HTML以发布时,我知道了问题可能是什么。我的输入实际上与
data val remote
属性一起使用。我的模糊处理程序是否可能在远程验证发送响应之前被调用,因此插件认为输入仍然有效?嗯。。。当然,获取响应的远程验证延迟可能是原因之一。什么是
.valid()
函数?可能有一个
complete
success
回调可以使用…valid()函数只是一个普通的jQuery验证方法,在我的TL中有一个指向它的链接;以上博士。我以前在插件中搜索过验证事件,从中可以看出没有。对此的答案描述了一种使远程验证同步的方法,以便对
valid()
的调用按预期工作,但要使其与ASP.NET Core的不引人注目的库一起工作可能很困难