Проверка формы JQuery возвращает true, но необходимо вернуть false - PullRequest
2 голосов
/ 02 января 2011

Я запускаю эту проверку формы при отправке формы:

if((formData[4].value == 1 || formData[4].value == 2) && !formData[2].value) { 
    alert('Please fill out the key field');
    return false;
} else {
    $.ajax({
        url: "/ajax/key_check.php",
        cache: false,
        data: "key=" + formData[4].value,
        dataType: "html",
        success: function(data) {
            if(data == 1) {
                alert('Key already exists');
                return false;
            }
        }
    });

    return true;
}

Сценарий работает, он предупреждает, что ключ уже существует, если данные == 1, однако форма все еще отправляется.Я подумал, вернув false, если data == 1 остановит обработку формы, однако она продолжается и все равно добавляет ключ, а всплывающее окно с ключом уже существует.Как я могу остановить отправку формы, если data == 1?Я пытался даже сделать это:

if(data == 1) {
    alert('Key already exists');
    return false;
} else {
    return true;
}

Затем удалил возвращаемое значение true в нижней части скрипта, но такая же проблема возникает.Появляется всплывающее окно, но форма все еще обрабатывается.

Ответы [ 2 ]

3 голосов
/ 02 января 2011

A return в обратном вызове возвращает из этого обратного вызова , а не родительскую функцию, как вы хотите ... однако вы можете получить желаемый эффект, например так:

if((formData[4].value == 1 || formData[4].value == 2) && !formData[2].value) { 
    alert('Please fill out the key field');
    return false;
} else {
    $.ajax({
        url: "/ajax/key_check.php",
        cache: false,
        data: "key=" + formData[4].value,
        dataType: "html",
        success: function(data) {
            if(data == 1) {
                alert('Key already exists');
            } else {
              $("#someForm")[0].submit();
            }
        }
    });
    return false;
}

То, что это делает, никогда не отправляется напрямую, но , если проверка в порядке, вызывает * native .submit() метод , отправка формы и повторный запуск этого обработчика.

0 голосов
/ 02 января 2011

Проблема в том, что запрос AJAX происходит асинхронно & mdash; он вызывает вашу функцию успеха после , внешняя функция возвращает true. Это функция успеха (не ваша внешняя функция), возвращающая false, которая не имеет отношения к тому, будет ли форма отправлена ​​или нет.

Вам придется всегда возвращать false из этой внешней функции, а затем в функции успеха AJAX, если проверка прошла успешно, отсоедините исходный обработчик отправки и используйте метод .submit() 1009 * формы для отправки формы в обычном режиме:

(В этих примерах кода я предполагаю, что form - это объект jQuery, который оборачивает базовый элемент DOM формы.)

success: function(data) {
    if(data == 1) {
        alert('Key already exists');
    } else {
        form.unbind('submit'); // Prevent the AJAX validation from happening again
        form.submit(); // Submit the form normally
    }
}

В качестве альтернативы, вы можете вызвать native form.submit() метод браузера , и строка "unbind" не понадобится:

form[0].submit();
...