2013-05-31 122 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: ....