2011-09-30 22 views
1

我想做一些表單驗證功能。這裏是我的:如何在ajax成功函數外保存var值?

<script> 
$(document).ready(function() { 

var myObj = {}; 

$('#username').keyup(function() { 

    id = $(this).attr('id'); 
    validateUsername(id);  

}); 

function validateUsername(id){ 

var username = $("#"+id).val(); 

    $.ajax({ 
     url : "validate.php", 
     dataType: 'json', 
     data: 'action=usr_id&id=' + username, 
     type: "POST", 
     success: function(data) { 

      if (data.ok == true) { 

       $(myObj).data("username","ok"); 

      } else { 


       $(myObj).data("username","no"); 

      } 

     } 
    }); 


} // end validateusername function 


$('#submit').click(function(){ 

    if (myObj.username == "ok") { 

     alert("Username OK"); 

    } else { 

     alert("Username BAD"); 

    } 


}); 




}); // end doc ready 

所以你可以看到,當在文本框中按下一個鍵時,它檢查它是否有效。 「data.ok」回來正確。問題是基於響應,我定義$(myObj).username。出於某種原因,我無法獲得此值在validateusername函數外工作。當點擊提交按鈕時,它不知道$(myObj).username的值是什麼。

我需要使用這樣的事情,因爲在頁面上多個表單域來驗證,我可以這樣做:

if (myObj.username && myObj.password && myObj.email == "ok") 

...提交表單前檢查我所有的表單字段。

我知道我必須錯過一些基本的東西....任何想法?

編輯:解決

我所要做的就是改變VAR MyObj中= {};myObj = {};和它的魅力。我想我一直在盯着這個屏幕waaaaay太久了!

+0

祝你好運阿賈克斯跟上別人的輸入... –

回答

2

您沒有訪問正確存儲的數據。進入用戶名值是這樣的:

$(myObj).data("username") 

資源:

看看jQuery的.data() docs

Very simple jsFiddle顯示如何使用jQuery的.data()方法正確設置和檢索數據。

+0

哦,你說得對。我看着錯誤的一個。對於那個很抱歉。 – mowwwalker

+0

@Walkerneo,不用擔心。 –

+0

我試過了,它沒有工作:( – Oseer

0

我會將承諾存儲在該全局變量中,然後在提交按鈕單擊中將事件綁定到完成事件。

$(document).ready(function() { 

var myObj = false; 

$('#username').keyup(function() { 

    id = $(this).attr('id'); 
    validateUsername(id);  

}); 

function validateUsername(id){ 

    var username = $("#"+id).val(); 

    myObj = $.ajax({ 
     url : "validate.php", 
     dataType: 'json', 
     data: 'action=usr_id&id=' + username, 
     type: "POST", 
     success: function(data) { 
      $('#username').removeClass('valid invalid'); 
      if (data.ok == true) { 
      $('#username').addClass('valid'); 
      } 
      else { 
      $('#username').addClass('invalid'); 
      } 
     } 
    }); 


} // end validateusername function 


$('#submit').click(function(){ 

    // if myObj is still equal to false, the username has 
    // not changed yet, therefore the ajax request hasn't 
    // been made 
    if (!myObj) { 
     alert("Username BAD"); 
    } 
    // since a deferred object exists, add a callback to done 
    else { 
     myObj.done(function(data){ 
      if (data.ok == true) { 
       alert("Username BAD"); 
      } 
      else { 
       alert("Username OK"); 
      }    
     }); 
    } 

}); 




}); // end doc ready 

雖然爲了防止多個ajax請求同時處於活動狀態,但您可能希望爲keyup事件添加一些限制。

+0

在將第一行改爲「myObj = false」(刪除了var)之後,這個工作,但問題在於myObj將根據返回的結果POST。這就是我在成功函數中所做的... – Oseer

+0

你可以想到我用作以前使用的成功函數的「完成」函數,難道你不能只是把那個額外的邏輯放在那裏嗎?我不確定爲什麼從第一行刪除var將會產生任何影響,這一切都應該是正確的範圍。 –

+0

啊,我明白你的意思了。只有該功能添加成功方法,實際上不修改myObj成功事件我會更新示例 –