2012-02-27 150 views
0

所以我陷入了死衚衕。我有AJAX腳本和jQuery驗證插件。有了這個腳本,當我的頁面加載空時,聯繫表單會自動提交。如果我移動或添加$('#submit').click(function() {而不是AJAX腳本部分,則在$(document).ready(function() {之下,然後提交它將忽略我的驗證表單。AJAX和jQuery驗證問題

任何幫助將不勝感激。

<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script> 
<script type='text/javascript' src='http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.js'></script> 
<script> 
    var captcha_a = Math.ceil(Math.random() * 10); 
    var captcha_b = Math.ceil(Math.random() * 10); 
    var captcha_c = captcha_a + captcha_b; 

    function generate_captcha(id){ 
     var id = (id) ? id : 'lcaptcha'; 
     $("#"+id).html(captcha_a + " + " + captcha_b + " = "); 
    } 

    $(document).ready(function() { 

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

      jQuery.validator.addMethod("math", 
       function(value, element, params) { return this.optional(element) || value == params[0] + params[1]; }, 
       jQuery.format("Please enter the correct value for {0} + {1}") 
      ); 

      $("#commentform").validate({ 
       rules: { 
        captcha: { 
         math: [captcha_a, captcha_b] 
        } 
       } 
      }); 

     }); 

    }) 
</script> 

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

     var name = $('input[name=name]'); 
     var phone = $('input[name=phone]'); 
     var email = $('input[name=email]'); 
     var reason = $('select[name=reason]'); 
     var info = $('textarea[name=info]'); 

     var data = 'name=' + name.val() + '&phone=' + phone.val() + '&email=' + email.val() +'&reason=' + reason.val() + '&info=' + encodeURIComponent(info.val()); 

     $('.loading').show(); 

     $.ajax({ 
      url: "ajaxformtoemail.php", 
      type: "GET", 
      data: data, 
      cache: false, 
      success: function (html) { 
       if (html==1) { 
        $('.form').fadeOut('slow'); 
        $('.done').fadeIn('slow'); 
       } else alert('Sorry, unexpected error. Please try again later.'); 
      } 
     }); 
     return false; 
    }); 
</script> 
+0

爲了便於閱讀,我縮進並格式化了您的代碼。 – Sparky 2012-02-27 06:52:59

回答

1

您的ajax正在頁面加載中運行,因爲沒有任何東西阻止它。您需要將ajax代碼放入事件處理程序中,因此只有在您的表單通過驗證時纔會調用它。

以下是適當實施驗證插件的示例。而且您不需要將validate()放入點擊處理程序中。驗證插件有一大堆自己的處理程序,包括submitHandler,當表單通過驗證時觸發。

<script type='text/javascript'> 

$(document).ready(function() { 

    jQuery.validator.addMethod("math", 
     function(value, element, params) { return this.optional(element) || value == params[0] + params[1]; }, 
     jQuery.format("Please enter the correct value for {0} + {1}") 
    ); 

    $('form').validate({ 
     rules { 
      // your rules 
     }, 
     submitHandler: function(form) { 
      $.ajax({ 
       // your ajax parameters 
      });   
      return false; 
     } 
    }); 

}); 

</script> 

Validation Plugin Documentation

一些枝節問題...

  1. 您的代碼會更容易閱讀&排查,如果你使用正確的縮進和標準格式。

  2. 有沒有必要使用重複document.ready函數。一切都可以在一個裏面。

  3. 和#2一樣,您不需要單獨設置<script></script>標籤來包含您的代碼。一切都可以封閉一次。

+0

非常感謝Sparky。我之前使用過「stackoverflow」作爲參考,但這是我第一次真正在尋求幫助。所以,如果適當縮進,我會變得更好。謝謝你的建議,明天我會試試。 – user1234729 2012-02-27 06:58:00

+0

OoMuGaaaash !!!它是活着的!我花了整個週末試圖解決這個問題。兄弟,你的Paypal電子郵件賬號是什麼,讓我給你買一瓶啤酒。上週五應該問你,所以我可以花一些時間與我的gf相反。謝謝Sparky,謝謝你'submitHandler:function(form)' – user1234729 2012-02-28 03:40:18

+0

@ user1234729,我很高興你明白了。我建議你深入瞭解插件文檔中發佈的實際驗證示例......它們可能比有些難以瀏覽的官方文檔更有用。 – Sparky 2012-02-28 03:46:20