2011-10-24 52 views
0

我有一個討厭的變量作用域問題$ .post。在提交表單之前,我想先檢查用戶是否編輯過內容。如果用戶沒有,我會返回false。

我已經看過Stackoverflow上的一堆不同的例子,一般的做法是在函數內部創建一個函數和一個回調函數來處理回調。我的問題是,當我調用下面的getReturned,回調沒有得到實現(知道這是因爲表單被提交,我試過一個警報)。順便說一句,alert("No changes were made so text was not submitted.");成功調用。

我在做什麼錯?

function getReturn(callback, id, old_variable){ 
    var return_value = "ERROR"; 
    $.post('myURL', {"id" : id}, 
     function(data) { 
      var text_from_server = $.trim(data[0].note_text); 
      if (old_variable == text_from_server){ 
      alert("No changes were made so text was not submitted."); 
      return_value = false; 
      callback(return_value); 
      } else { 
      return_value = true; 
      callback(return_value); 
      } 
     }, 
     "json" 
    ); 
    }; 
var id = 123; 
var old_variable = "foo"; 
getReturn(
     function(return_value){return return_value;/*alert("SUCCESS!");*/}, 
     id, 
     old_variable 
); 
+0

當你在回調中測試報警,你是否也有一個return語句之前警報? @Ariel似乎是對的,但回調仍應該被調用。 – Lycha

回答

1

由於您正在進行異步請求以測試值是否已更改,因此您必須始終從提交處理程序返回false。在回調中,如果表單已被編輯,您可以使用form.submit()手動提交表單。事情是這樣的:

getReturn( 
    function(return_value) { 
     if (return_value) { 
      $("#myForm").submit(); 
     } 
    },  
    id,  
    old_variable); 
return false; 
1

你不明白異步執行。你不能從返回任何東西!不要忘記這一點。你所能做的只是觸發執行一些東西 - 你可以嘗試設置一個變量標誌,但它不會幫助你。你還需要觸發一個執行該標誌的函數,並且必須從$ post中調用該函數。

您正在發送的函數作爲回調返回一個值。但它不會將價值返回到任何地方。你在$ post中調用它,並且它返回$ post內的值 - 這對你根本沒有任何用處,因爲你沒有對返回值做任何事情。

我會告訴你如何改變它,除非你沒有說你想用這個返回值做什麼。

+0

謝謝@Ariel。如果'old_variable == text_from_server'爲true,我想返回false以便表單不提交。 – ksindi

+0

但是,您已經提交了表單 - 否則您如何擁有'text_from_server'? – Ariel