使用jquery检索大量数据

时间:2010-04-13 08:14:41

标签: php jquery ajax

我创建了这个聊天系统,以前工作正常,直到消息数量增加(超过300条消息,我希望它最多需要1000条)开始导致脚本速度慢并且需要时间来检索所有数据。 这个想法取决于选择数据XML样式,然后将其添加到特定选项卡并使用setTimeout重复行为,有没有其他方法,我真的需要想法,这是我的代码。

 function updateMessage()
 {
  $.post("db.php",
  {MsgNo :$("#no_of_msgs").val()},
  function(data)
 {
   $(data).find("message").each(function() {
   var msg_id = $(this).find("msg_id").text();
   var date_time = $(this).find("date_time").text();
   var from_user = $(this).find("from_user").text();
   var from_user_id = $(this).find("from_user_id").text();
   var from_group = $(this).find("from_group").text();
   var to_user = $(this).find("to_user").text();
   var to_user_id = $(this).find("to_user_id").text();
   var to_group = $(this).find("to_group").text();
   var msg_type = $(this).find("msg_type").text();
   var msg = $(this).find("msg").text();
   var from_grp_abr = $(this).find("from_grp_abr").text();
   var to_grp_abr = $(this).find("to_grp_abr").text();
   var flagged = $(this).find("flagged").text();
   var onlydate = getonlydate(date_time);
   $("#no_of_msgs").val(msg_id);


   if (from_group == $("#login").val())
{
 var reply = '';
}
else {var reply = 'reply';}

   if(from_user == "")
   {
    var handle_reply = from_grp_abr;
   }
   else 
   {
    var handle_reply = from_user;
   }

   var html = "<tr id='row_"+msg_id+"'>";
   html += "<td><a class='bullet' onclick='changeStatus(\""+msg_id+"\")'>&nbsp;<\/a><\/td>";
   html += "<td><a class='"+reply+"' onclick=\"reply('"+escape(handle_reply)+"','"+escape(to_user)+"',"+from_user_id+","+to_user_id+");\">  <\/a><\/td>";
    html += "<td class='time'>"+date_time+"<\/td>";
     html += "<td>"+from_user+"&nbsp;["+from_grp_abr+"]"+"<\/td>";
     html += "<td>"+to_user+"&nbsp;["+to_grp_abr+"]"+"<\/td>";
     html += "<td><a href='#' class="+msg_type+"><\/a><\/td>";
html += "<td><a id='flag_"+msg_id+"' class='"+class_flag+"' onclick='flagMsg("+msg_id+")'>  <\/a><\/td>";
         html += "<td>"+msg+"<\/td>";
         html += "<td>"+from_grp_abr+"<\/td><\/tr>";

           $('#no_of_msgs').val(msg_id);

  $("#tbody1").prepend(html);
updatetabledata('t1');
alternateRows('t1');
 //append data to tab2 messages received
    if (to_group == $("#login").val())
    {
         $("#tbody2").prepend(html);
         updatetabledata('t2');
         alternateRows('t2');
      }
   //append data to tab3 sent messages
else if (from_group == $("#login").val())
   {
   $("#tbody3").prepend(html);
   updatetabledata('t3');
   alternateRows('t3');
  }

   if(from_group != $("#login").val())
  {
   $("#tbody"+from_group).prepend(html);
   updatetabledata('t'+from_group);
   alternateRows('t'+from_group);
  }
   if(to_group != $("#login").val())
  {
   $("#tbody"+to_group).prepend(html);
   updatetabledata('t'+to_group);
   alternateRows('t'+to_group);    
  }
    });
 });
   setTimeout('updateMessage()',3000); 
 }

我认为问题在于使用each()然后在几个标签上同时分发数据。

1 个答案:

答案 0 :(得分:2)

服务器应仅响应自上次特定客户端轮询以来的新消息。同样,消息的初始下载可以分解为多批X消息。由于您已经有了消息ID字段,最简单的方法是客户端向服务器发送轮询数据时最新消息的消息ID,这样您就不必单独跟踪客户端服务器端。