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

时间:2017-09-08 18:56:23

标签: javascript jquery validation asp.net-core

我正在创建一个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。也许我的模糊处理程序只是在远程验证发送响应之前被调用,所以插件认为输入仍然有效?

2 个答案:

答案 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()方法提供的highlightunhighlight回调每个都会引发一个合成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
    });
});