Это частично продолжение этой темы: jquery - возвращаемое значение из функции обратного вызова (в пост-запросе) в функцию, которая находится внутри?
потому что я обновил код, но проблема остается. Я проверяю простую HTML-форму с помощью jquery, и, несмотря на все мои другие операторы 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
}
}
ПРАВКА РЕДАКТИРОВАТЬ: Хорошо, я исправил ошибку в моей функции обратного вызова, как видно из первого ответа, и теперь появилась другая проблема. Я отладил функцию valid_pass_combo_callback
, и она получает правильное значение из validate.php; в этом случае invalid_old
- это возвращаемое значение. Когда я отлаживаю, data
равен invalid_old
. Однако сравнение не удается ... поэтому код всегда переходит к последнему оператору else, несмотря ни на что. Ничего не происходит, потому что там нет никакого поведения, так почему сравнение всегда терпит неудачу?
РЕДАКТИРОВАТЬ, РЕШЕНО: Я решил отказаться от привязки этой функции к отправке и вместо этого привязать к событию onclick для кнопки в форме (которую я использую вместо кнопки отправки), и это решило проблему. Проверка вызывается, когда нажимается кнопка, и если проверка на стороне клиента проходит, то форма отправляется на сервер для проверки там.