2013-07-17 57 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循環,旋轉,直到響應設置,但會可能是一個糟糕的解決方案

希望這有助於