Могу ли я изменить глобальную переменную из обработчика событий? - PullRequest
1 голос
/ 09 августа 2011

Я работаю над проверкой ввода CAPTCHA с использованием AJAX.Я понял, что не могу вернуть значение из обработчика успеха вызова AJAX, поэтому я создал глобальную переменную, чтобы обработчик успеха и функция проверки могли общаться друг с другом.Но это работает не самым плохим образом.Во-первых, код:

jQuery('#contact').submit(function(event) {
        if (validate_form())
        {
            submit_form(event);
        }
        else
        {
            return false;
        }
    });

var valid = true;

function validate_form()
{
    valid = true;

    // test form stuff here
    // if something goes wrong valid will be set to false

    if (!valid)
    {
        alert("form is not valid, refreshing captcha");
        // refresh form
        // ....
    }
    else
    {
        alert("form is valid, checking captcha");
        check_recaptcha();
    }

    alert("finally, form is:" + valid);
    return valid;
}

function check_recaptcha()
{
    alert("checking captcha now");
    // take only recaptcha values from form
    var recaptcha_vals = jQuery(':input[name^="recaptcha"]').serialize();
    jQuery.post('recaptcha.php', recaptcha_vals, function(data) {
        alert("recaptcha post has succeeded!");
        if (data == '1\n' /*success!*/)
        {
            alert("recaptcha is correct!");
            jQuery('#recaptcha_error').empty();
        }
        else
        {
            alert("recaptcha is incorrect!");
            show_recaptcha();
            jQuery('#recaptcha_error').html("<p class=\"error\">CAPTCHA was incorrect, please try again.</p>");
            valid = false;
        }
    });
}

Я тестировал этот код, не вводя ничего в поле ввода CAPTCHA (очевидно, неверное значение).Согласно предупреждениям, каждая часть кода прошла должным образом, за исключением того, что valid по-прежнему true после выполнения check_recaptcha(), хотя я знаю, что "неправильная" ветвь была соблюдена.Итак, вопрос № 1: Почему обработчик событий не может установить valid в false?

Вот где это становится странным.В приведенном выше сценарии форма не отправляется, даже если validate_form() возвращает true (согласно предупреждениям).Однако, когда я закомментирую все оповещения и попробую снова с теми же самыми входными данными, тогда форма ДОЛЖНА отправить.Итак, вопрос № 2: Что случилось с ЭТОМ? # 1, тем не менее, важнее.

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Суть асинхронных обратных вызовов заключается в том, что jQuery.post() немедленно вернет , не ожидая ответа от службы recaptcha.Поэтому, когда вы отправляете свое предупреждение «наконец», перевод рекаптчи все еще продолжается , и ваш обратный вызов будет вызван после его завершения.Затем, пока ваше оповещение ожидает, когда вы нажмете ОК, приходит ответ на повторный запрос и ваш обратный вызов запускается.Если вы закомментируете предупреждение, ваш обработчик отправки завершит до , обратный вызов получит шанс установить допустимое значение false.

Это , почему вам необходимо предоставить обратный вызовво-первых, вместо того, чтобы просто читать возвращаемое значение.

Также : вы знаете, что проверка капчи на стороне клиента не имеет смысла, если только вы не повторите проверку на стороне серверапозже, верно?(Возможно, это бессмысленно, даже если вы повторяете это на сервере. Смысл проверки на стороне клиента состоит в том, чтобы предоставить пользователю мгновенную обратную связь о проблеме, не дожидаясь обращения к серверу по сети. Если вы ожидаете отправки, пока не завершитеВ обратном направлении, чтобы проверить капчу, вы добились только удвоения времени отклика в успешном случае. Единственное исключение, о котором я могу подумать, - это если ваша форма содержит действительно большие объемы данных, для передачи которых потребуется значительное время).

0 голосов
/ 10 августа 2011

Я нашел свой ответ здесь: Javascript Local против Global .Я пошел против совета этого ответа, и установил мой запрос, чтобы быть синхронным, который работал хорошо в контексте моего заявления.

...