2013-07-17 86 views
1

我已经使用jquery验证来验证电子邮件。但是在成功函数中其值被改变的变量在其外部是不可访问的。它可以通过async = false来完成,但是破坏了Ajax的目的。在成功函数外使用javascript变量

下面是代码:

$.validator.addMethod('verifyemail',function(value,element){   
    $.ajax({ 
     type: "POST", 
     url : $.app.urls('base_url')+'account/check_email', 
     data: {'email' : value}, 
     success: function(msg){ 
      //If email exists, set response to true 
      if(msg.status == 'false') 
       respond = false; 
      else 
       respond = true; 
     } 
    }) 
    console.log(respond); 
    return respond; 
}, "Email is Already Taken"); 
+0

__Problem:__尝试使用未定义的变量。 __解释:__ AJAX请求需要一些时间,您不能在$ .ajax调用之后读取结果。 __Solution:__事件驱动的程序流程,单独的验证器方法和AJAX请求。检查有效并且默认为无效。 –

回答

4

在这样的异步功能时无法设置值的响应变量。它的工作方式是respond将被设置为一个值。然后你的异步ajax调用就会触发,一旦它触发你的ajax调用将执行的下面的代码的其余部分。一旦ajax调用返回,成功回调中的代码将被执行。很可能,到此时您的验证器功能将完成执行。

由于您在验证程序中使用此ajax调用,因此验证取决于您的ajax调用的结果,所以您希望按顺序执行此操作。您可以通过设置async: false来完成此操作。

下面是异步回调一个有用的资源,他们是如何工作的:

http://blog.parse.com/2013/01/29/whats-so-great-about-javascript-promises/

而另一个覆盖jQuery的AJAX功能异步VS同步:

http://net.tutsplus.com/tutorials/javascript-ajax/event-based-programming-what-async-has-over-sync/

+0

我知道aync:false,但是不会破坏Ajax的使用吗? –

+0

它只会失败异步运行函数的目的,但由于您需要http请求的结果来确定验证,所以您需要串行运行它。 – jrthib

+0

非常感谢你然后 –

0

访问您需要可以定义它在上范围

$.validator.addMethod('verifyemail',function(value,element){   
    var respond = true; // scope of variable to current function 
    $.ajax({ 
     type: "POST", 
     url : $.app.urls('base_url')+'account/check_email', 
     async: false, 
     data: {'email' : value}, 
     success: function(msg){ 
      //If email exists, set response to true 
      if(msg.status == 'false') 
       respond = false; 
      else 
       respond = true; 
     } 
    }) 
    console.log(respond); 
    return respond; 
}, "Email is Already Taken"); 
+0

仍然无法正常工作 –

+0

没问题,有异步问题,请检查更新的答案 –

+0

感谢您的回复 –

1

Ajax调用是异步的,意思是当你拨打 console.log(回应); 变量响应仍然不可用。如果您需要在成功函数外访问它,则可以触发自定义事件并在事件处理程序中获取响应。

当然,你必须在外部范围内作出回应。

+0

如果可能,请示例 –

+0

我认为jquery.validator主要用于客户端验证。由于表单验证在客户端和服务器端都完成,我建议您发布(ajax)表单并显示返回的错误(如果有的话)。在同步模式下使用ajax将锁定浏览器,从而给用户带来不好的体验。 – NeoWang

+0

这就是我现在面临的问题 –

0

respond已经是一个全局变量(缺少var关键字),但AJAX的异步特性意味着它在下列行运行时不一定可用,因此您需要使用几种方法之一对其进行排序

  • 让它同步的(但问题规则出)
  • 把响应代码相同的匿名函数
  • 里面你也可以做一个while循环,旋转,直到响应设置,但会可能是一个糟糕的解决方案

希望这有助于