javascript - 如何订购运行 ajax 的 jQuery 然后必须返回 true

标签 javascript jquery ajax forms validation

我有一个非常简单的 javascript 用于检查我的表单字段的表单验证。该函数要么构建一个 errorList 变量并返回 false,要么如果该变量为空,则该函数返回 true 并提交。

我为这个验证函数添加了一个新层。我现在想调用一个外部函数,它只发送一个包含所有表单验证的 Ajax 请求,然后通过电子邮件告诉我用户是否通过了表单验证。

当表单未通过验证时调用此外部函数是可以的,就像我返回 false 时一样;显然表单没有提交,因此允许 ajax 完成。

我只是不知道如何触发外部函数,让它完成,然后返回 true 并让表单提交。它只是跳过 ajax 请求。

有人可以帮忙解释一下逻辑吗?

验证函数:

if (errorList.length > 0) {

    // Log the errors in quote.shared.js:
    logValidationErrors("N/A - Pre Quote", $("#prequote-form"), "productname", errorList);

    $("#error-list").html("");
    $("#error-list").append(errorList);
    $("#error-div").slideDown(500, function() {
        $( '#error-div' ).ScrollTo(300);
    });
    return false;
} else {

    // Log the valid passing through this function in quote.shared.js:
    logValidationErrors("N/A - Pre Quote", $("#prequote-form"), "productname", "none"); 
    return true;
}

ajax函数:

// logValidationErrors
function logValidationErrors(xOrderNumber, xForm, xProduct, xErrors) {
    /*
    alert(xOrderNumber);
    alert(xForm);
    alert(xProduct);
    alert(xErrors);
    */

    $.ajax({
        url:    "log-clientside-events.php?" +
                "type=javascript-errors&" +
                "ordernumber=" + xOrderNumber + "&" +
                "formvalues=" + encodeURIComponent(xForm.serialize()) + "&" +
                "product=" + xProduct + "&" +
                "errors=" +  encodeURIComponent(xErrors),
        context: document.body,
        cache: false,
        timeout: 10000,
        success: function(sHTML){

        },
        error:function (xhr, ajaxOptions, thrownError){
            //window.location.href = window.location.href;
        }
    });


}

Anup 帮助解决了这个问题。关键是创建一个“标志”变量,该变量在 Ajax 第一次运行时为 false,然后在 ajax 完成时将其设置为 true,然后再次提交表单,然后“标志”检查第二次跳过 Ajax 阶段- 并返回 true。

if (errorList.length > 0) {

    // Log the errors in quote.shared.js:
    logValidationErrors("N/A - Customer Details", $("#customer-form"), "productname", errorList);

    $("#error-list").html("");
    $("#error-list").append(errorList);
    $("#customer-login-success-message").slideUp(100);
    $("#error-div").slideDown(500, function() {
        $( '#error-div' ).ScrollTo(300);
    });
} else {

    if (validationSuccessfullyLoggged) {
        return true;

    } else {
        // Log the valid passing through this function in quote.shared.js:
        logValidationErrors("N/A -  Customer Details", $("#customer-form"), "productname", "none"); 

    }
}

return false;

处理ajax的函数:

// logValidationErrors
var validationSuccessfullyLoggged = false;

function logValidationErrors(xOrderNumber, xForm, xProduct, xErrors) {
    /*
    alert(xOrderNumber);
    alert(xForm);
    alert(xProduct);
    alert(xErrors);
    */

    if (xErrors == "none") {
        xErrors = "<li>Form Validated Successfully</li>";   

        submitForm = true;
    } else { 
        submitForm = false;
    }

    $.ajax({
        url:    "log-clientside-events.php?" +
                "type=javascript-errors&" +
                "ordernumber=" + xOrderNumber + "&" +
                "formvalues=" + encodeURIComponent(xForm.serialize()) + "&" +
                "product=" + xProduct + "&" +
                "errors=" +  encodeURIComponent(xErrors),
        context: document.body,
        cache: false,
        timeout: 10000,
        success: function(sHTML){

            //alert(validationSuccessfullyLoggged);

            if (submitForm) { 
                validationSuccessfullyLoggged = true;
                xForm.submit();
            }
        },
        error:function (xhr, ajaxOptions, thrownError){
            //window.location.href = window.location.href;
        }
    });


}

最佳答案

问题的一般原因是当您发出 AJAX 请求时,它是异步的(AJAX 中的第一个“a”)。因此,在您调用 logValidationErrors 函数后,返回 true 会在 ajax 操作返回之前运行。

为了解决这个问题,我可以想到两种通用方法(尽管可能还有其他我没有想到的方法):

1) 在 jQuery 的 ajax 方法中,您可以将 async 设置为 false(因此它不再是异步的)。有关详细信息,请参阅他们的文档:http://api.jquery.com/jQuery.ajax/

我个人不推荐这样做,除非是在非常特殊的情况下(而且我认为你的例子对我来说不合格),因为你会锁定浏览器一段时间,并且会破坏异步请求的目的。

2) 一种替代方法是您始终从主 JavaScript 代码中返回 false。换句话说,在调用 logValidationErrors 函数之后,也返回 false(或者在 if/else block 之后只有一个 return false 语句。然后,当 ajax 操作实际完成时,在成功处理程序中你想触发你的成功场景(例如提交表单),并且在错误场景中(请参阅 jQuery ajax 文档中的错误选项),您可能想要调用您的错误场景。

没有看到您的更多代码并且当您调用您发布的特定 if/else 示例时,我不能更精确,可能有更优雅的方法来处理这个问题。根据您要执行的操作,可能还需要牢记其他注意事项。例如,如果提交您的表单只是要调用相同的 if/else block ,您可能需要一个跟踪变量来指示您已经发出初始 ajax 请求,以便这次您可以继续并在需要时提交。

希望对您有所帮助。

关于javascript - 如何订购运行 ajax 的 jQuery 然后必须返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35119200/

相关文章:

javascript - 如何在AngularJS中从另一个page2(service2.html) Controller (ctrl2)调用page1(service1.html) Controller (ctrl1)的功能

javascript - jQuery 单击事件显示 JSON 数组中的特定数据无法正常工作

jQuery 选项卡启用水平滚动

javascript - function.js 中的 this.nextSibling

javascript - 如何以百分比形式显示ajax响应的加载状态?

javascript - 使用来自 Ajax 响应的 JSON 数据数组?

javascript - 设置心电图纸质网格间隔(highcharts.js)

javascript - 是否可以从 JavaScript 中的 HTTP 响应 header 中获取 Set-Cookie 值?

javascript - 需要帮助使用 php、ajax、javascript 将数据插入数据库

javascript - 有没有办法选择具有特定属性值的所有元素?