在JQuery验证中避免'async:false'

时间:2013-02-19 13:31:13

标签: jquery ajax jquery-validate

我编写了一个用于检查自定义字段的JQuery验证方法。为了检查数据,我使用AJAX调用服务器端脚本,而AJAX又返回true或false。如果为false,则响应也将包含错误消息:

var errorMessage;
var rtErrorMessage = function() {
    return errorMessage;
}

jQuery.validator.addMethod('customvalidation', function(value, element) {
    var valid = true;
    var url = '/validation?data=' + value;
    $.ajax({
        url: url,
        type: 'get',
        dataType: 'json',
        async: false,
        success: function(responseData) {
            if (responseData && !responseData.isValid) {
                errorMessage = responseData.errorMessage;
                valid = false;
            }
        }
    });

    return valid;
}, rtErrorMessage);

这是有效的,但同步性的转变意味着浏览器在请求期间冻结。这很烦人,JQuery甚至建议反对它......但是替代方案是什么?

提前致谢。

5 个答案:

答案 0 :(得分:4)

使用jquery validate的远程方法 - 如果返回true或false,则会收到默认错误消息,并且该字段被标记为valid / invalid。

如果您返回任何其他字符串,例如“这是我的错误消息”,则显示的错误消息将是您返回的字符串。

如果文档另有说明它们已经过时我正在使用jquery validate 1.10.0

答案 1 :(得分:1)

执行此操作的标准方法是将控制权交给回调函数,让用户知道数据库做出决定后发生了问题。显然,如果你真的想要一个返回ajax调用结果的函数,你需要async = false,但还有其他方法可以做到这一点。您不需要等待每个ajax调用返回true以防止表单提交,直到所有表单元素都被验证为止 - 您只需要检查一些标志(回调可以设置)以确保表单元素已被验证。如果某些验证请求尚未完成,这可能需要稍等一些,但通常用户比ajax慢。

TLDR:使用ajax异步,并且在必须之前不要等待回调。如果你不能进行几个进程,那么你就会遇到async = false。

答案 2 :(得分:1)

我认为必须发生的是你的验证器应该总是返回false,除非该字段先前已经过验证(也就是说,自上次验证后没有发生任何变化且验证成功) 。显然,这需要一些额外的处理程序。实际上,您可能想重新考虑一下如何做到这一点。大多数使用Ajax的验证器可能会立即“使控件无效”并在onchange处理程序中调用一些去抖动的方法,该方法会触发一些Ajax,然后验证控件是否有效,并在收到后标记控制是否有效。使用这样的东西,你永远不会把Ajax调用放在验证器方法中,但你会使用前面提到的标志。我会编写一些代码来演示,但我的主计算机暂时停机。

答案 3 :(得分:0)

就这篇文章而言,我实际上发现async:false正在破坏我的验证,我有一个报告的问题,用户反馈是“我尝试提交XXXX但我收到错误然后当我尝试再次提交它不会让我“。仅当我在远程验证请求上具有async:false时才会发生。我以为我需要它是异步但事实证明我没有。让它们真实再次成为一切笨拙的海鲂。非常奇怪。

答案 4 :(得分:-1)

如果您必须按服务器执行验证,则按正常方式提交表单(如果出现错误),则返回带有错误消息的预填表单。根本不要使用Ajax,只是意味着你必须将数据发送到服务器两次。