2013-03-24 53 views
1

我有一個想法,這可能是愚蠢的,但我一直堅持了幾個小時。jQuery的驗證與addMethod失敗時,它不應該

我有一個簡單的表單,使用jQuery驗證使用ajax來確定電子郵件地址是否已經在數據庫中。很棒。當找到一個電子郵件地址時,它會報告重複,如果沒有,則爲無聲。

但是,當我輸入一個我知道是新的電子郵件,並填寫表格的其餘部分,然後按提交,它會阻止提交表單並將焦點設置在電子郵件字段。

這裏是jQuery的:

$(document).ready(function(){ 
var email; 
var name; 
var passwd; 
var passwd_repeat; 

    //form validation rules 
    $("#regForm1").validate({ 
     rules: { 
      name: { 
       required: true, 
       minlength: 3, 
      }, 
      passwd: { 
       required: true, 
       minlength: 8, 
      }, 
      passwd_repeat: { 
       required: true, 
       equalTo: passwd, 
       minlength: 8 
      } 
     }, 
     messages: 
     { 
      name: "Please enter your name.", 
      passwd: "Please enter a password.", 
      passwd_repeat: "Passwords must match." 
     } 
    }); 

    $.validator.addMethod("validateUserEmail", function(value, element) { 
     var inputElem = $('#regForm1 :input[name="email"]'), 
     data = { "email=" : inputElem.val() }, 
     eReport = ''; //error report*/ 
     var dataString = 'email='+ inputElem.val(); 
     $.ajax({ 
      type: "POST", 
      url: '/checkdups.php', 
      data: dataString, 
      success: function(html) { 
       if (html !== 'true') { 
        $('#email').after('<label class="error" for="email">error - '+inputElem.val()+' already in use. Please <a href="http://tester4.com/staff/auth/login">Log in</a> with '+inputElem.val()+'.</label>'); 
        return false; 
       } 
       else { 
        return true; 
       } 
      }, 
      error: function(xhr, textStatus, errorThrown) 
      { 
       alert('ajax loading error... ... '+url + query); 
       return false; 
      } 
     }); 
    }, 
''); 

$(':input[name="email"]').rules("add", { "validateUserEmail" : true});  

});

我添加了addMethod而不是使用.remote的規則,因爲我無法讓事情比第一次更有效(意思是它不會拒絕一連串沒有頁面刷新的模糊),而且這個被認爲是一種解決方法。當我評論添加的方法時,它允許我提交表單,但當然不檢查欺騙。

無論如何,任何見解都將非常感謝。

約翰

回答

2

你真的應該使用remote。我不知道你爲什麼沒有按預期工作 - 遠程肯定是確實是被多次調用。默認情況下,它的工作方式是在您點擊提交之前不要撥打遠程頁面,然後如果您的遠程通話說不好,每次按鍵之後都會產生一個新的遠程通話。

這是您可以構建的simple working example。我將其設置爲始終返回false,直到您做出3次更改。所以你應該可以按照下列步驟操作:

  1. 輸入[email protected]並點擊提交。請注意,它被標記爲無效。
  2. 刪除M(無效)
  3. 刪除O(無效)
  4. 刪除c(無效的,但由於它不是現在有效的電子郵件地址)
  5. com(固定)
  6. 提交(作品)

從小提琴的鍵碼爲在規則對象(響應是針對本實施例中的全局計數器):

rules: { 
    email: { 
     email: true, 
     remote: { 
      url: '/echo/json/', 
      data: { 
       json: function(){ 
        response++; 
        return (response > 3)?'true':'false'; 
       } 
      }, 
      complete: function(data){ 
       $('#log').append('remote triggered<br>'); 
      }, 
      type: 'post' 
     }, 
     required: true 
    } 
} 
0

@Ryley,謝謝你的回覆。我重試遙控器,它工作正常。我想我的Firefox緩存有問題。

我看起來很像你的,所以謝謝!