JQuery Form Validator никогда не делает AJAX вызов - PullRequest
0 голосов
/ 12 августа 2011

Это частично продолжение этой темы: 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 для кнопки в форме (которую я использую вместо кнопки отправки), и это решило проблему. Проверка вызывается, когда нажимается кнопка, и если проверка на стороне клиента проходит, то форма отправляется на сервер для проверки там.

Ответы [ 2 ]

1 голос
/ 12 августа 2011

Глядя на свой код, вам не нужно отправлять форму, но вы делаете вызов 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_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
    }
}
1 голос
/ 12 августа 2011

Одна проблема здесь - вы вызываете свой обратный вызов, а не передаете саму функцию:

$.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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...