2009-04-30 85 views
8

停止我得到了下面的代碼:提交表單不jQuery的AJAX調用

$.ajax({ 
    type: "POST", 
    async: false,    
    url: "CheckIdExist", 
    data: param, 
    success: function(result) { 
     if (result == true){ 
      return false; 
     }         
    }, 
    error: function(error) { 
     alert(error); 
     return false; 
    } 
}); 

如果AJAX返回值爲true,窗體需要停止提交。

但它並沒有停止提交表單。

請任何幫助。

回答

1

在這種情況下,您需要執行同步http請求,即您必須將the async option設置爲false。
在您的版本中,httpxmlrequest是異步的。在onsubmit處理程序返回並且在onsubmit處理程序的上下文之外調用onsuccess回調後,可能會很長時間完成。
「return false」將是匿名函數函數(result){...}的返回值,而不是onsubmit處理函數的返回值。

2

你需要做一個回調。

This entry in the FAQ當我有這個確切的問題時幫了我很多。

getUrlStatus('getStatus.php', function(status) { 
    alert(status); 
}); 

function getUrlStatus(url, callback) { 
    $.ajax({ 
     url: url, 
     complete: function(xhr) { 
      callback(xhr.status); 
     } 
    }); 
} 

原因是你不能在AJAX函數中返回。

由於異步編程的性質,上述代碼無法按預期工作。提供的成功處理程序不會立即調用,而是在將來從服務器接收到響應時。所以當我們在$ .ajax調用後立即使用'status'變量時,它的值仍然是未定義的。

1

在一個函數或一個形式的onsubmit你不能把這個代碼,成功函數返回它的結果返回給jQuery的AJAX的背景下,而不是形式提交環境。

+0

問題的一部分,但主要問題是ajax函數是異步的,因此不能返回值,因爲代碼執行不會等待此函數完成。 – Sylverdrag 2009-05-20 11:11:35

15

我假設你有這樣的:在AJAX調用

form.submit(function(event) { 
    $.ajax(...); 
}); 

你想return false(或稱event.preventDefault())在事件處理函數本身,而不是,如:

form.submit(function(event) { 
    $.ajax(...); 
    event.preventDefault(); 
}); 
+2

非常好 - 使用event.preventDefault()解決了我的問題,並在用戶單擊我的表單上的按鈕時阻止頁面刷新。感謝DarkWulf! – 2009-08-22 08:12:22

+0

do not for jquery 1.8.3 – 2012-11-28 07:01:06

1

我也有這個問題,但解決了它通過更改輸入類型=「提交」鍵入=「按鈕」,然後只是做你的ajax請求

$("input#submitbutton") 
    { 
          $.ajax(
         {       type: "POST", 
          async: false,    
          url: "CheckIdExist", 
          data: param, 
          success: function(result) { 
           if (result == true){ 
            //TODO: do you magic 
           }      
           else 
            $("form").submit();   
          }, 
          error: function(error) { 
           alert(error); 
           return false; 
          } 
         }); 
    }); 
7

這個問題的一個小小的變化是: 我想用jQuery和ajax向用戶提供錯誤消息, ,但如果沒有錯誤,然後進行正常處理。

如果沒有錯誤,假設方法「check」返回空的響應,並且如果有任何錯誤,則返回錯誤。

然後,你可以做這樣的事情在你準備功能:

$("#theform").submit(function() { 
    var data = { ... } 
    $.get('/check', data, 
     function(resp) { 
      if (resp.length > 0) { 
       $("#error").html(resp); 
      } else { 
       $("#theform").unbind('submit'); 
       $("#theform").submit(); 
      } 
    }); 
    event.preventDefault(); 
}); 

那麼,它是如何工作的?當外部提交函數被觸發時,它會構建AJAX調用所需的數據(這裏是更高級別的函數get)。該調用已安排好,並且主要操作線程立即繼續,但提交無條件停止,因此沒有任何明顯的情況發生。

過了一段時間,AJAX調用返回請求的結果。如果非空,結果會顯示給用戶。

但是,如果響應爲空,則提交功能將被解除綁定。這可以防止系統通過外部提交功能進行額外的呼叫。內部提交函數被調用。這觸發了一個實際的表單提交到表單的目標,生活如預期般繼續。