Javascript 如何在ajax回调后从主函数返回false?

Javascript 如何在ajax回调后从主函数返回false?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我通过发出ajax调用并提供回调来执行编辑,以确保避免重复的电子邮件。如果存在重复项,我希望从submit事件返回false。有没有一种不设置async=false的优雅方法来实现这一点?我尝试的(请参阅emailCallback)不起作用 提交事件 编辑(包括提交处理程序的其余部分) 为什么不在Ajax调用成功完成时提交表单,而不是传递回调呢 $("#form-accounts").on("submit", function (e) { // Always cancel the sub

我通过发出ajax调用并提供回调来执行编辑,以确保避免重复的电子邮件。如果存在重复项,我希望从submit事件返回false。有没有一种不设置async=false的优雅方法来实现这一点?我尝试的(请参阅emailCallback)不起作用

提交事件

编辑(包括提交处理程序的其余部分)


为什么不在Ajax调用成功完成时提交表单,而不是传递回调呢

$("#form-accounts").on("submit", function (e) {
    // Always cancel the submit initially so the form is not submitted until after the Ajax call is complete
    e.preventDefault();

    ...

    checkDupEmail(this);

    ...
});

function checkDupEmail(form) {
    var data = {};
    data.action = "validate-email";
    data.email = $("#email").val();
    ajax('post', 'php/accounts.php', data, function(result) {
        if (parseInt(result) > 0) {
            showMessage(0, "The email address is in use. Please supply another or login instead of creating a new account.")
        } else {
            form.submit();
        }
    }
}

比这更好的方法是使用Ajax提交表单。这将消除对服务器的两次调用。

我认为在这些情况下,您必须始终使用
e.preventDefault()
然后在AJAX响应处理程序中,调用
e.target.submit()
以提交有效的表单。在提交表单之前,我需要做其他事情。我需要做的是取消提交时,有一个重复的电子邮件。检查重复的电子邮件之前,表单提交。在访问者输入电子邮件后立即执行此操作(使用
$('#电子邮件)。更改
处理程序)。在这种情况下,只需将所有提交功能从事件处理程序移动到表单.submit()行之前。
$("#form-accounts").on("submit", function (e) {
    // Always cancel the submit initially so the form is not submitted until after the Ajax call is complete
    e.preventDefault();

    ...

    checkDupEmail(this);

    ...
});

function checkDupEmail(form) {
    var data = {};
    data.action = "validate-email";
    data.email = $("#email").val();
    ajax('post', 'php/accounts.php', data, function(result) {
        if (parseInt(result) > 0) {
            showMessage(0, "The email address is in use. Please supply another or login instead of creating a new account.")
        } else {
            form.submit();
        }
    }
}