jquery表单验证器从不进行ajax调用

时间:2011-08-12 14:05:40

标签: php jquery ajax callback

这部分是此主题的延续:jquery - return value from callback function (in post request) into the function its inside of? 因为我更新了代码,但问题仍然存在。我正在用jquery验证一个简单的html表单,尽管我的所有其他if / else语句都在工作,但ajax调用永远不会被调用。这是javascript代码:

var pass_form = $('#pass_form'); pass_form.submit(valid_pass_sett);

function valid_pass_sett() {
    //remove old errors - snipped
    pass_old = $('input[name=pass_old]').val();
    pass_new = $('input[name=pass_new]').val();
    pass_confirm_new = $('input[name=pass_confirm_new]').val();

    if (pass_old === "") {
        //display error on form - snipped
        return false;
    } else if (pass_new === "") {
        //display error on form - snipped
        return false;
    } else if (pass_new != pass_confirm_new) {
        //display error on form - snipped
        return false;
    } else if (pass_new.length < 8) {
        //display error on form - snipped
        return false;
    } else {
        $.post("http://www.example.com/ajax/validate.php",{ // async validation
            type: 'valid_old_change_pass', 
            pass_old: pass_old,
            pass_new: pass_new
        }, valid_pass_combo_callback);
        alert('after the ajax call...');
    }
    return false;  // cancel form submission
}

这是validate.php的相关部分:

$username = $_SESSION['username'];
$pass_old = $_POST['pass_old'];
$pass_new = $_POST['pass_new'];
if (empty($pass_old) || empty($pass_new)) {
    echo "invalid";
} else if (!User::valid_user_pass($username, $pass_old)) {
    echo "invalid_old";
} else if (!Sanitize::is_legal_password($pass_new)) {
    echo "invalid_new";
} else {
    echo "valid";
}

当我使用Firebug进行调试,并且所有其他表单输入都正确时,脚本会进入ajax调用,然后提交表单,即使它应该调用回调函数。这是回调函数的代码:

function valid_pass_combo_callback( data ) {
    if (data == 'valid') {
        //only if the form is valid!
        pass_form[0].submit();
    }
    else if (data == "invalid_old") {
        //display error on form - snipped
    }
    else if (data == "invalid_new") {
        //display error on form - snipped
    }
    else {
        //it always jumps to here..., even though data *is* the correct value
    }

}

EDIT redux:好的,我在回调函数中修正了错误,如第一个答案所示,现在,出现了一些不同的问题。我调试了函数valid_pass_combo_callback,它从validate.php中获取了正确的值;在这种情况下,invalid_old是返回的值。调试时,data等于invalid_old。但是,比较失败...所以代码总是跳转到最后一个else语句,无论如何。没有任何事情发生,因为那里没有任何行为,为什么比较总是失败?

编辑,已解决:我决定放弃绑定此功能以提交,而是绑定到表单上的按钮的onclick事件(我使用它代替提交按钮),这解决了问题。单击按钮时将调用验证,如果客户端验证通过,则表单将提交给服务器以进行验证。

2 个答案:

答案 0 :(得分:1)

这里的一个问题是你正在调用你的回调,而不是传递函数本身:

$.post("http://www.example.com/ajax/validate.php",{ // async validation
        type: 'valid_old_change_pass', 
        pass_old: pass_old,
        pass_new: pass_new
    }, valid_pass_combo_callback); // Remove (data) so the callback
                                   // isn't invoked immediately.

答案 1 :(得分:1)

查看您的代码,您不必提交表单,但要进行ajax调用,但您说表单已提交。我认为在下面的代码中存在一些js错误,因为表单已经提交了。

$.post("http://www.example.com/ajax/validate.php",{ // async validation
            type: 'valid_old_change_pass', 
            pass_old: pass_old,
            pass_new: pass_new
        }, valid_pass_combo_callback(data));//Here is the issue, it will call the method right away
        alert('after the ajax call...');

为什么不阻止表单提交的默认行为。

function valid_pass_sett(e) {

   e.preventDefaul();//This will ensure the form will never be submitted.

在回调方法中进行一些小改动以取消绑定提交处理程序,然后提交表单。这是因为我们已经有一个提交处理程序,我们不想在下次提交以下方法时调用它。

function valid_pass_combo_callback( data ) {
    if (data === 'valid') {
        //only if the form is valid!
        pass_form[0].unbind('submit').submit();
    }
    else if (data === "invalid_old") {
        //display error on form - snipped
    }
    else if (data === "invalid_new") {
        //display error on form - snipped
    }
}