一尘不染

jQuery-从回调函数(在后请求中)返回值到函数内部?

ajax

我有一个JavaScript函数,可将数据发布到验证脚本并从那里获取值。post请求上的回调函数返回一个布尔值,而我试图获取 整个
函数以返回该布尔值。现在,回调函数返回正确的值,但是函数本身不返回任何值。这是代码:

function validate(request_type, request_text) {
    $.post("http://www.example.com/ajax/validate.php",{
        type: request_type, 
        text: request_text
    }, function(data) {
        return (data == "valid");
    });
}

我意识到这有点像“同步”调用,而这并不是AJAX的目的,但是我已经在validate.php(数据库调用等)中拥有许多我无法在Javascript中实现的功能,我看到了线程像这一个是谈使用某种形式的处理程序。

我如何编写一个简单的处理程序,当在语句中使用变量data或布尔比较的结果时,该处理程序才可用?data == "valid"``if/else

编辑:例如,if将使用布尔结果的语句之一:

if (!validate('password',pass_new)) {
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();

编辑:用onsubmit我的HTML形式的事件调用的函数:

function valid_pass_sett() {
    //code to remove errors left over from previous submissions - snipped
    pass_old = $('input[name=pass_old]').val();
    pass_new = $('input[name=pass_new]').val();
    pass_confirm_new = $('input[name=pass_confirm_new]').val();
    //some if statements that don't involve AJAX requests - snipped
    if (!validate('password',pass_new)) {
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();
        return false;
    }

    return true;
}

我尚未编辑此代码以包含已发布的更新代码,但是我的问题是如何return false从中停止提交表单?


阅读 459

收藏
2020-07-26

共1个答案

一尘不染

除非您进行 同步 AJAX调用(您可能不想这样做),否则您根本无法做到。

如果在您的代码中的多个位置使用了此函数,则最好的选择是允许它 接收 一个函数。

这样,您实际上是直接将代码传递进来,而不是依赖 函数 返回 的结果来在某些代码中使用,因此可以确保使用响应。

var my_form = $('#my_form');

my_form.submit( valid_pass_sett );

function valid_pass_sett() {
    //code to remove errors left over from previous submissions - snipped
    pass_old = $('input[name=pass_old]').val();
    pass_new = $('input[name=pass_new]').val();
    pass_confirm_new = $('input[name=pass_confirm_new]').val();

    validate('password', pass_new, pswd_validation_callback); // async validation

    return false;  // cancel form submission
}

function validate(request_type, request_text, callback ) {
    $.post("http://www.example.com/ajax/validate.php",{
        type: request_type, 
        text: request_text
    }, callback );
}

function pswd_validation_callback( data ) {
    if ( data === 'valid' ) {
         // if valid, call the native .submit() instead of the jQuery one
        my_form[ 0 ].submit();
    } else {
         // Otherwise do your thing for invalid passwords.
         // The form has already been canceled, so no concerns there.
        $('#pass_new').addClass('error');
        $('#pass_confirm_new').addClass('error');
        $(error_string.format('Please enter a valid password.')).insertAfter('#pass_confirm_new');
        $('#pass_text_short').hide();
        $('#pass_text_long').show();
    }
}

编辑: 更改为使用有问题的代码。

编辑: 更新与发布的其他代码一起使用。 为了清楚起见,将答案缩小到命名函数。

2020-07-26