Javascript jQuery valid()在委托模糊处理程序中给出了错误的值
我正在创建一个ASP.NET核心web应用程序,用于客户端验证,并使用HTML5数据-*属性配置验证。我有一个文本输入,我通过事件委托处理它的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
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的不引人注目的库一起工作可能很困难