2014-06-05 67 views
0

我有以下代碼:AJAX的錯誤發送形式沒有Ajax

$("#contactform").validate({ 
    rules: { 
     // ... 
    }, 
    submitHandler: function(form) { 
     var postData = $(form).serializeArray(); 
     var formURL = $(form).attr("action"); 
     $.ajax({ 
        url : formURL+'validate', 
        type: "POST", 
        data : postData, 
        success: function(data, textStatus, jqXHR) 
        { 

          $.ajax({ 
           url : formURL, 
           type: "POST", 
           data : postData, 
           beforeSend: function(){ 
            // ... 
           }, 

           success:function(data, textStatus, jqXHR) 
           { 
            // ... 
           }, 
           error: function(jqXHR, exception) 
           { 
            $(form).submit(); 
           }, 
           complete: function(){ 
            // ... 
           } 
          }); 
        }, 
        error: function(jqXHR, exception) 
        { 
         $(form).submit(); 
        } 

       }); 
    } 
}); 

在2個地方我有$(form).submit(); - 我想在這個地方提交應更改爲後發送的形式不使用AJAX(URL一個在行爲屬性中的形式)。

在好像數據正在使用AJAX發送的時刻 - 當我添加警報發送$(form).submit();警報正在顯示一個又一個(我準備PHP腳本返回不正確的數據)

*編輯*

變更後我的代碼是:

我開始形式

<form method="post" action="{{ current_url }}" id="contactform" onsubmit="return formAjaxSubmit(this);"> 

我的完整AJAX代碼:

$("#contactform").validate({ 
     rules: { 
      content_{{ hash_tag }}: { 
       required: true, 
       minlength: 20 
      }, 
      name_{{ hash_tag }}: { 
       required: true, 
       minlength: 2 
      }, 
      subject_{{ hash_tag }}: { 
       required: true, 
       minlength: 10 
      }, 
      email_{{ hash_tag }}: { 
       required: true, 
       email: true 
      } 
     }, 
     submitHandler: function(form) { 

     } 
    }); 


    function formAjaxSubmit(form) { 

      var postData = $(form).serializeArray(); 
      var formURL = $(form).attr("action"); 
      $.ajax({ 

         url : formURL+'validate', 
         type: "POST", 
         data : postData, 
         success: function(data, textStatus, jqXHR) 
         { 
           $.ajax({ 
            url : formURL, 
            type: "POST", 
            data : postData, 
            beforeSend: function(){ 
             if(data.valid == 1) { 
              $(form).hide(); 
              $("#formsending").show(); 
             } 
            }, 

            success:function(data, textStatus, jqXHR) 
            { 
             $('#articlecontent').html(data.content); 
             $("html, body").animate({ scrollTop: 0 }); 
             return false; 
            }, 
            error: function(jqXHR, exception) 
            { 
             return true; 
            }, 
            complete: function(){ 
             if(data.valid == 1) { 
              $("#formsending").hide(); 
              $(form).show(); 
             } 
            } 
           }); 
         }, 
         error: function(jqXHR, exception) 
         { 
          return true; 
         } 

        }); 

    } 

</script> 

但是現在我遇到了使用jQuery驗證字段的問題。當我點擊提交,即使表單沒有完成時,表單也會通過AJAX發送,即使jQuery驗證完成,也只是在顯示PHP驗證結果之後。如果我從形式和submitHandler刪除onsubmit我:

formAjaxSubmit(form); 

一切似乎很好地工作。

+0

你的表單代碼在哪裏?我懷疑它進入一個循環:你提交(submitHandler通過ajax發送),onError - 表單重新提交(submitHandler通過Ajax發送,錯誤再次發生,onError - 表單重新提交(submitHandler通過Ajax發送)等 – Husman

+0

我的表單是標準的HTML形式,沒什麼特別的,我知道這是通過AJAX發送的,所以我問是否有可能重新發送錯誤的表單,而不是使用AJAX,對於沒有表單的標準AJAX錯誤(加載頁面內容),我可以簡單地使用'window.location .href = url;'重新加載頁面不使用AJAX –

+0

在下面的答案中看到我的解決方案。它試圖做ajax提交,如果ajax失敗,你返回true,迫使表單通過傳統方法提交 – Husman

回答

1

我提出的解決方案是

<form action="nonAjaxSubmitHandler.php" onsubmit="return tryAjaxSubmit();"> 
... 
</form> 


function tryAjaxSubmit() { 
    // Ajax code - on success 
    return false; // stops form submitting via http post 

    // On error 
    return true; // form will submit via http post 
} 

正如評論(感謝ElmoVanKielmo)指出的那樣,你可能需要設置async: false選項,在您的jQuery的崗位(成功後:和失敗:選項)。

onSubmit強制表單運行tryAjaxSubmit(),根據此方法的結果,表單將通過HTTP POST(或GET)提交或不提交。

所以在tryAjaxSubmit,我們嘗試我們的Ajax代碼:

  • 如果是全成,我們返回(這樣的形式都不是人工提交 和網頁不刷新)
  • 如果有一個錯誤,我們返回和形式手動提交

試試這個:

<form method="post" action="{{ current_url }}" id="contactform" onsubmit="return formAjaxSubmit(this);"> 

<script> 
function formAjaxSubmit(form) { 
    // Do validation 
    $("#contactform").validate({ 
    rules: { 
     //.... 
    }, 
    submitHandler: function(form) { 
     // When form is validated, submit via ajax 
     var postData = $(form).serializeArray(); 
     var formURL = $(form).attr("action"); 
     $.ajax({ 
     url : formURL+'validate', 
     type: "POST", 
     data : postData, 
     success: function(data, textStatus, jqXHR){ 
      ... 
      return false 
     }, 
     error: function(jqXHR, exception) 
     { 
      return true; 
     } 
     }); 
    }); 
} 
</script> 
+0

jQuery AJAX回調不能干擾事件處理程序,處理程序繼續執行並最終退出,即使AJAX請求仍在運行 – ElmoVanKielmo

+0

@ElmoVanKielmo - 它可以。表單不會提交tryAjaxSubmit返回。它不會返回任何東西,如果你使用jQueries「async:false」選項將你的ajax回調設置爲同步 – Husman

+0

@Husman這似乎是我需要的東西,但我將不得不將我的驗證方法以某種方式驗證而無需提交併在onsubmit時發送已啓動。我會在今天晚些時候嘗試 –

-1

我的假設是,由於提交處理程序已經連接,所以當你正在做另一個提交時,它再次調用提交處理程序。

不要嘗試提交相同的表單,並嘗試使用動作url和從當前表單到另一個表單的序列化數據生成另一個表單。

請在下面找到提交數據的解決方案
1.刪除提交處理程序,然後調用submit()。頁面將刷新並提交處理程序將重新附加。
2.使用一個變量來存儲錯誤標誌(我不會推薦,但仍然是一種方法)。在發送AJAX請求之前在提交處理程序中使用此標誌。