2013-04-17 50 views
1

我正在驗證註冊頁面上的表單,除了電子郵件驗證有點碰到和錯過之外,一切正常。表單不能在電子郵件JSON驗證後提交

它工作正常,如果我只是驗證它,以確保它是一個實際的電子郵件地址,但是當我嘗試添加一個檢查,看看它是否在使用以及我遇到問題。

驗證本身工作正常,但表單一旦驗證且未使用就不會提交。

這工作,並提交表單:

if(filter.test(a)){ 
     email.removeClass("field_error"); 
     emailInfo.text(""); 
     emailInfo.removeClass("error"); 
     return true; 
    } 

這工作,但形式不提交:

if(filter.test(a)){ 
     $.post('php/availability.php',{email: $('#email').val()}, function(emaildata){ 
      if(emaildata.exists){ 
       email.addClass("field_error"); 
       emailInfo.text("(Email address in use)"); 
       emailInfo.addClass("error"); 
      } else { 
       email.removeClass("field_error"); 
       emailInfo.text(""); 
       emailInfo.removeClass("error"); 
       return true; 
      } 
     }, 'JSON'); 
    } 

我難倒。

+0

什麼是回來的emaildata? –

+0

它返回'存在'。確切地說{「exists」:true}。 – Adam

+0

如果它返回'{「exists」:true}',那麼您的電子郵件地址正在使用中,並且表單不應該提交。也許我的理解不正確。 –

回答

1

這個問題與AJAX調用的異步性質有關(第一個'A')。

在第一個示例中,您將落入if區塊,並立即返回true,我假定您允許您提交表單。

但是,在第二個示例中,您屬於if塊,但是您異步調用Web資源(availability.php)。您的代碼進行AJAX呼叫(呼叫$.post()),然後立即到達if區塊的末尾。不會返回True,所以表單不會提交。

你需要做的是:

  • exists===false邏輯移動到一個單獨的函數;
  • 在您的if區塊中,如果電子郵件有效,則調用該函數;
  • 你的函數查找表(使用jQuery說了),然後將其提交

所以修改後的代碼可能看起來像:

if(filter.test(a)){ 
     $.post('php/availability.php',{email: $('#email').val()}, function(emaildata){ 
      if(emaildata.exists){ 
       email.addClass("field_error"); 
       emailInfo.text("(Email address in use)"); 
       emailInfo.addClass("error"); 
      } else { 
       submitForm(email, emailInfo); 
      } 
     }, 'JSON'); 
    } 

然後submitForm()確實是這樣的:

function submitForm(email, emailInfo){ 
    email.removeClass("field_error"); 
    emailInfo.text(""); 
    emailInfo.removeClass("error"); 
    $('#theForm').submit(); 
} 

我想,那麼,你應該看到你的表單提交。

希望這會有所幫助!

+0

感謝您的回答。但是,爲了在表單提交中返回true,必須完成多個驗證。這會覆蓋這些並提交表單嗎?或者這只是發送另一個提交電話,觸發剩下的驗證? – Adam

+0

如果您的提交依賴於現有的電子郵件,那麼您應該將其封裝在一個函數中,該函數在$ .post返回時會被調用。無論這是從上面創建的'submitForm'函數中調用的第二個函數,還是全部使用單個函數(即,將所有驗證放在'submitForm'中)。需要記住的是你的'$ .post'調用是異步的,所以你的驗證需要在'$ .post'返回後觸發。我希望這有幫助。 –

+0

好的,我會記住這一點,看看我能做些什麼。謝謝你的幫助! – Adam

相關問題