2013-05-31 50 views
0

我對JQuery相當陌生,而且我的代碼存在一個小問題。我希望你們中的任何一位都能幫助我。JQuery的工作速度太快?

我使用外部PHP文件將某些HTML數據加載到我的主文件中。現在有另一個外部PHP文件更新相同的數據。我正在使用JQuery函數來檢查我想要更新的字段的值,如果它不爲空,我將調用更新文件。在我重新加載DIV後,我正在處理新的數據(使用外部加載數據文件)。

現在的問題是,我相信我的JQuery函數/有時/不會等待更新文件完成,並立即從第二個文件中讀取新內容,而無需等待內容實際更新。這種情況偶爾會發生,但不會持續。

這是我的jQuery函數:

$("#updateAdminMessage").live("click", function() { 
     if($("#adminMessage").val() != ""){ 
      $.post("/includes/script_files/updateAdminMessage.php", { adminMessage: $("#adminMessage").val() }) 
      $("#div_adminMessage").hide(); 
      $('#div_adminMessage').load('/includes/script_files/loadAdminMessageClass.php'); 
      $("#div_adminMessage").fadeIn(); 
     } 
     else{ 
      alert('do not leave this field blank'); 
     } 
    }); 

在你想知道的情況下,讀文件簡單地打印一些HTML代碼從我的數據庫中讀取所需的數據之後,並更新文件更新非常相同的數據。

我的JQuery代碼有什麼問題嗎?因爲坦率地說,我相信我的PHP閱讀&更新文件工作得很好。

+1

請勿使用'live'on'。 Live已被棄用。 –

+0

Javascript運行異步。所以你應該使用回調函數。 –

+0

編程中沒有太快的東西;) –

回答

4

問題是post是一個異步操作,所以它會立即執行並返回,並在等待該請求完成時,load函數將被執行。

做到這一點是使用一個回調的正確方法:

$.post("/includes/script_files/updateAdminMessage.php", { 
    adminMessage: $("#adminMessage").val() }, 
    function(){ 
     $("#div_adminMessage").hide(); 
     $('#div_adminMessage').load('/includes/script_files/loadAdminMessageClass.php'); 
     $("#div_adminMessage").fadeIn(); 
}) 
+0

注意@TomNidi在你的淡入淡出過程中發生了同樣的問題,淡入淡出很可能發生在內容加載到div之前,並且可以用相同的方式修復。 –

+0

完美地工作。不勝感激! –

0

可以使用後的回調函數成功啓動剩餘負荷:

$("#updateAdminMessage").live("click", function() { 
     if($("#adminMessage").val() != ""){ 
      $.post("/includes/script_files/updateAdminMessage.php", { adminMessage: $("#adminMessage").val() }, success: function(){ 
       $("#div_adminMessage").hide(); 
       $('#div_adminMessage').load('/includes/script_files/loadAdminMessageClass.php'); 
       $("#div_adminMessage").fadeIn(); 
      }) 
     } 
     else{ 
      alert('do not leave this field blank'); 
     } 
    }); 
0

你說得對,jQuery.post()不是阻止功能,但是它的第三個參數是成功功能,所以你可以把任何你想要發生的事情放在「後」在那裏:

 $.post("/includes/script_files/updateAdminMessage.php", { adminMessage: $("#adminMessage").val() }, function(data,status,xhr){ 
      $("#div_adminMessage").hide(); 
      $('#div_adminMessage').load('/includes/script_files/loadAdminMessageClass.php'); 
      $("#div_adminMessage").fadeIn(); }); 
0

這就是你所說的競賽條件。我假設你在後臺有一些數據庫,所以第一個php腳本和hide()相互競爭。解決方案是

  1. 添加後和負載
  2. 使用success callback之間睡覺,這將等待後()來完成。
+0

我明白了,謝謝。 –

0

歡迎來到奇妙的異步世界。

這需要進去的 「後」 成功回調處理:

$("#div_adminMessage").hide(); 
$('#div_adminMessage').load('/includes/script_files/loadAdminMessageClass.php'); 
$("#div_adminMessage").fadeIn(); 


jQuery.post(url [, data ] [, success(data, textStatus, jqXHR) ] [, dataType ]) 

看起來像

$.ajax({ 
    type: "POST", 
    url: url, 
    data: data, 
    success: function (data, textStatus, jqXHR) { 

     $("#div_adminMessage").hide(); 
     $('#div_adminMessage').load('/includes/script_files/loadAdminMessageClass.php'); 
     $("#div_adminMessage").fadeIn(); 

    }, 
    dataType: dataType 
}); 

這等大概是「淡入」,需要在未來的回調去

你可能會迫使jQuery來等待/塊,直到請求已完成,但多數民衆贊成打破Ajax背後的概念(「A」代表異步):

... 
async: false, 
data: ....