可以在事件处理程序中更改全局变量吗?
Can I alter a global variable from within an event handler?
我正在使用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
在check_recaptcha()
执行后仍然是true
,尽管我知道遵循的是"错误"分支。所以问题#1是:为什么事件处理程序不能将valid
设置为false
?
这就是奇怪的地方。在上面的场景中,表单没有提交,即使validate_form()
返回true
(根据警报)。但是,当我注释掉所有警报并使用完全相同的输入再次尝试时,表单确实提交了。所以问题#2是:这是怎么回事? #1更重要。
异步回调的要点是jQuery.post()
将立即返回,而无需等待来自recaptcha服务的回复。因此,当您发出"finally"警报时,recapthcha事务仍在进行,并且当它完成时将调用您的回调。然后,当警报等待您单击OK时,recaptcha回复到达并运行回调。如果注释掉警报,则在回调有机会将valid设置为false之前,提交处理程序将完成。
这就是为什么首先需要提供回调,而不仅仅是读取返回值的原因。
Also:您知道在客户端检查captcha是毫无意义的,除非您稍后在服务器端重复检查,对吗?(可以说,即使您在服务器上重复它也是毫无意义的。客户端验证的目的是向用户提供故障的即时反馈,而无需等待到服务器的网络往返。如果您等到完成验证码的往返后才提交,那么在成功的情况下,除了将响应时间增加一倍之外,您什么也没做。我能想到的唯一例外是,如果您的表单包含非常大量的数据,将花费可观的时间来传输)。
- 如何将事件处理程序存储在变量中,并在以后将其绑定到对象
- 什么's是处理多个js文件之间交互的简单方法,同时避免溢出全局变量
- 存储一个事件处理程序中的变量以供另一个事件处理器使用
- 如何将更改事件处理程序附加到变量
- js事件循环是否意味着可以为临时暂存空间使用全局变量
- 用javascript更新事件函数中的全局变量
- FRP、角度和全局事件处理程序
- 全局变量从事件侦听器中变得未定义 - javascript
- 调用保存到附加了事件处理程序的变量的函数
- 为什么 Javascript 事件处理程序会更改我的 PHP 变量
- 我的javascript变量在jquery事件处理程序上没有更新
- CoffeeScript 在 'for v in values' 中创建一个全局变量 'v',导致事件中的错误引用
- jQuery全局Ajax事件处理程序的用例
- 使用事件处理程序(基本Javascript)时出现全局变量问题
- 事件处理程序函数上的全局和局部变量
- 事件处理程序之间的全局变量
- 具有动态创建元素的事件处理程序的全局变量范围
- 不能访问jQuery事件处理程序中的全局变量
- 为请求禁用一些jQuery全局Ajax事件处理程序
- 可以在事件处理程序中更改全局变量吗?