这部分是此主题的延续: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事件(我使用它代替提交按钮),这解决了问题。单击按钮时将调用验证,如果客户端验证通过,则表单将提交给服务器以进行验证。
答案 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
}
}