2

我在提交表单时运行了以下缩写验证代码。为我的表单设置了不显眼的验证。

(function () {
    "use strict";

    $("#feedbackForm").submit(function () {
        var t = $(this).serialize();
        var val = $(this).validate();
        console.log(val.errorList.length);
        return false;
    });
})();

当我在 Chrome 中遇到断点时,我看到以下行为: 不显眼的验证行为

您可以从控制台看到,当代码最初执行时,它在验证的错误列表中识别出 0 个错误,但是当我通过断点暂停执行时,它在验证的错误列表中识别出 4 个错误。此外,在第一次之后,正确的错误数会在运行时正确计算。

  • 这怎么可能?
  • 如何在运行时获得正确数量的错误?

编辑1:

我无法在 jsfiddle 上重现这个问题,所以肯定有其他事情发生。

小提琴


编辑2:

我还必须注意,setTimeout()在提交处理程序中使用每次都会在第二次获得正确的结果,但这似乎只是证实了 mattytommo 在他的回答中提到的内容。

4

2 回答 2

3

而不是validate你可以使用同步invalidHandler检查。这样你就知道它已经完成了。

它可能在您的 Fiddle 中起作用的原因可能是巧合,因为它可以更快地验证表单,但在您的实际实现中速度较慢。

尝试这样的事情:

$("#feedbackForm").submit(function () {
    var t = $(this).serialize();
    $(this).validate({
        invalidHandler: function(event, validator) {
            var errors = validator.numberOfInvalids();
            if (errors) {
                if (validator.errorList.length > 0) {
                    for (x=0;x<validator.errorList.length;x++) {
                        console.log("\n\u25CF " + validator.errorList[x].message);
                    }
                }
            }
        }
    });

   $(this).validate();

    return false;
});
于 2013-03-21T16:09:08.077 回答
3

最终我不确定为什么手动测量错误数量不起作用,但最后,我真正想做的就是验证表单并根据其状态做一些事情,为了实现这一点,Darin Dimitrov 的建议有效:

如何检查不显眼的验证是否已在 jquery 函数中验证?

我确信我已经尝试过这个valid()方法,但它没有用,但我想我没有。此外,与其他两种方法相比,不显眼的插件似乎更喜欢这种方法。

工作代码:

(function ($) {
    "use strict";
    
    $("#feedbackForm").on("submit", function () {
        var t = $(this).serialize(),
            val;

        val = $(this).validate();
        console.log(val.numberOfInvalids());
        console.log(val.errorList.length);
        console.log($(this).valid());       
        
        return false;
    });
})(jQuery);

验证

工作小提琴

小提琴在原来的情况下工作,所以没有必要更新它。

于 2013-03-21T17:27:25.870 回答