我正在驗證使用AJAX的CAPTCHA輸入。我意識到我無法從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雖然更重要。
如何在jQuery調用之前嘗試將'var valid = true;'放在一起? – Nayuki
@nayuki只會重置'有效'作爲本地回調的範圍...不是我所需要的。 – Xaq