3

我编写了一个用于检查自定义字段的 JQuery 验证方法。为了检查数据,我使用 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 甚至建议不要这样做……但是有什么替代方法呢?

提前致谢。

4

5 回答 5

4

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

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

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

于 2013-02-19T16:09:42.827 回答
1

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

TLDR:使用 ajax 异步,不要等待回调,直到你必须。如果你不能让几个进程运行,那么你就会被 async=false 困住。

于 2013-02-19T14:01:27.230 回答
1

我认为必须发生的事情是您的验证器应该始终返回 false,除非该字段之前已经过验证(也就是说,自上次验证以来没有发生任何更改并且验证成功)。这显然需要一些额外的处理程序。事实上,你可能想重新考虑一下你是如何做到这一点的。大多数使用 Ajax 的验证器可能会立即“使”控件“无效”并在onchange处理程序,该方法会触发一些 Ajax,然后验证控件与否,并在收到时将控件标记为有效与否。使用类似的东西,您永远不会将 Ajax 调用放在验证器方法中,但您会使用上述标志。我会编写一些代码来演示,但我的主计算机目前已关闭。

于 2013-02-19T14:36:06.230 回答
0

顺便说一句,我实际上发现 async:false 破坏了我的验证,我有一个报告的问题,用户反馈是“我尝试提交 XXXX 但我收到错误,然后当我尝试再次提交时不会让我”。仅在我有 async: false 远程验证请求时发生。我以为我需要它是异步的,但事实证明我不需要。再次使它们成为现实,使一切变得笨拙。很奇怪。

于 2013-10-31T00:11:34.083 回答
-1

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

于 2013-02-19T13:33:20.730 回答