Это частично продолжение из этого потока: 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 } }
EDIT redux: Хорошо, я исправил ошибку в моей функции обратного вызова, как видно из первого ответа, и теперь возникла другая проблема. Я отлаживал функцию valid_pass_combo_callback
и получал правильное значение от validate.php; в этом случае invalid_old
– это возвращаемое значение. Когда я отлаживаю, data
равны invalid_old
. Однако сравнение не удалось … поэтому код всегда перескакивает в последнее выражение else, независимо от того, что. Ничего не происходит, потому что там нет никакого поведения, так почему же сравнение всегда терпит неудачу?
EDIT, SOLVED: Я решил отказаться от привязки этой функции к отправке и вместо этого привязал событие onclick к кнопке в форме (которую я использую вместо кнопки отправки), и это решило проблему. Валидация вызывается, когда нажимается кнопка, и если проверка на стороне клиента проходит, форма отправляется на сервер для проверки там.