使用ajax聊天的setTimeout

时间:2009-07-29 11:55:34

标签: php javascript jquery ajax

好的嗨 帮助帮助 我遇到了setTimeout的一个主要问题,它没有工作,我做的一切都没有工作

我正在开发一个聊天系统,所以我需要发送和接收消息(我打开2个浏览器窗口测试它)

这是我多次更改的代码 我希望任何人都可以帮助我

的javascript

$(document).ready(function()
{
    updateMsg();
});

function updateMsg()
{
$.ajax({
    url:"db.php",
    type:"POST",
    success:function(data){
    }
});
setTimeout("updateMsg()",7000);
}

function addMessages()
{
$.ajax({
    url:"db.php",
    type:"POST",
    data:"name="+$("#name").val()+"&to="+$("#user2").val()+"& cc="+$("#user").val()+"&msg="+$("#msg").val(),  
    success:function(data)
    {
    $("#t1").prepend(data);}
});

}

php

$user_select = mysql_query("SELECT * FROM User WHERE User_name = '$name'") 
                        or die(mysql_error());
$fetch_select = mysql_fetch_array($user_select);
$user_check = mysql_num_rows($user_select);

if(isset($_POST['msg']) && $_POST['msg'] != '')
{
  if ($user_check == 0)
 {
mysql_query("INSERT INTO User (User_name) VALUES ('$name')") or die(mysql_error());

$new_user = mysql_query("SELECT * FROM User WHERE User_ID = LAST_INSERT_ID()");

$fetch_new_user = mysql_fetch_array($new_user);

mysql_query("INSERT INTO Messages(From_user,Msg_body,Date_Time) 
             VALUES ('$fetch_new_user[User_ID]','$msg',NOW())") or     die(mysql_error());
  }

  else 
    {
        mysql_query("INSERT INTO Messages(From_user,Msg_body,Date_Time) 
             VALUES ('$fetch_select[User_ID]','$msg',NOW())") or   die(mysql_error());
   }
   }

  $sql = mysql_query("SELECT Msg_body,Date_Time,User_name
                FROM Messages,User
                WHERE From_user = User_ID
                AND Msg_ID = LAST_INSERT_ID()
                ORDER BY Date_Time DESC") or die(mysql_error());

while($result = mysql_fetch_array($sql))
   {
       $mydata = '<tbody id="tbody1">
 <tr class="highlight">
<td  width="30" id="bullet" align="center">
<a href="#" class="nohighlight">&#8226;</a></td>
<td width="30px" align="center" id="replyImg"><input type="image" src="css/images/reply_arrow.png" onClick="reply()"></input></td>
<td width="70" align="Left" id="time">'.$result["Date_Time"].'</td>
<td width="200" align="Left" id="from">'.$result["User_name"].'</td>
<td width="200" align="Left" id="to">'.$result[""].'</td>
    <td id="showMsg">'.$result["Msg_body"].'</td>
    <td width="200" align="left" id="group">'.$result["Grp_abr"].'</td>     
  </tr>
  </tbody>';

}

    echo $mydata;

 ?>

谢谢你们

3 个答案:

答案 0 :(得分:1)

there's anything wrong with setTimeout的可能性很小。除了启动Ajax请求之外,您可以通过让updateMsg()在运行时看到某些内容来自行检查;做一个alert()或改变页面上某个方框的颜色。

如果这是你正在运行的代码,那么你遇到的最明显的问题是你的Ajax调用的回调函数是空的,所以没有做任何事情。

答案 1 :(得分:1)

可能没有达到setTimeout()。 在那里放一个警报()。

此外,您应该在回调函数中使用setTimeout()。否则,如果HTTP请求花费的时间太长,您将开始执行多个HTTP请求,而旧的请求仍将处于待处理状态。如果服务器已经超载,肯定会崩溃服务器,或者如果超过限制(通常是一次两个单独的请求),则会在浏览器中构建HTTP请求队列

在回调中放置setTimeout()可确保调用是同步/线性的。因此,您一次只能有一个HTTP请求。

即:

function updateMsg()
{
$.ajax({
        url:"db.php",
        type:"POST",
        success:function(data){
        }
});
setTimeout("updateMsg()",7000);
}

应该是:

function updateMsg()
{
$.ajax({
        url:"db.php",
        type:"POST",
        success:function(data){
          // after processing your stuff


          // make sure the next request is linear
          setTimeout("updateMsg()",7000);
        },
        fail: function() { /* handle your failed reqeust */ }
});

}

这不能解决您的问题,但它会解决您以后遇到的问题。 您还需要处理失败的请求。

答案 2 :(得分:0)

这与我最初开始的不同,但嘿,这是编程 JavaScript的 一种在屏幕上更新消息的功能。

  var last_msg_id = 0;
  function updateMessage()
  {
$.ajax({ 
    type: "post", 
    url: "db.php",
    data : {MsgNo :last_msg_id},
    dataType: "xml" ,
    success: 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_id = $(this).find("from_group_id").text();    
            var from_group = $(this).find("from_group").text();
            var from_grp_abr = $(this).find("from_grp_abr").text();
            var from_kind = $(this).find("from_kind").text();
            var row_bg_clr = $(this).find("from_bg_color").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 to_group_id = $(this).find("to_group_id").text();
            var to_grp_abr = $(this).find("to_grp_abr").text();
            var to_bg_color = $(this).find("to_bg_color").text();
            var to_kind = $(this).find("to_kind").text();
            var msg_type = $(this).find("msg_type").text();
            var msg = $(this).find("msg").text();
            var onlydate = getonlydate(date_time);
            var class_flag = ($(this).find("flagged").text() == 'true') ?    'flagged' : 'unflag';

            var reply = (to_group_id == $("#group_id").val()) ? 'reply' : '';

            var handle_reply = (from_user == "") ? from_grp_abr : from_user;
            //var styleclass = (8)? 'smoke' : 'blue';

           if (from_kind == 3)
           {
             var centerDiv = 'centerPopup(event,"changeObsLabel");';
             var change_label = 'change_label('+msg_id+',"'+msg_type+'","changeObsLabel");';
           }
           else if (from_kind == 4)
           {
             var centerDiv = 'centerPopup(event,"changeUserLabel");';
             var change_label = 'change_label('+msg_id+',"'+msg_type+'","changeUserLabel");' ;
           }
           else 
           {
             var centerDiv = 'centerPopup(event,"changeAnimLabel");';
             var change_label = 'change_label('+msg_id+',"'+msg_type+'","changeAnimLabel");' ;
           }

            var html = "<tr class='active' style='background-color:#"+row_bg_clr+"' id='row_"+msg_id+"'>";
            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 id='type_of_msg_"+msg_id+"' class="+msg_type+" onclick="+centerDiv+change_label+"> <\/a><\/td>";
            html += "<td><a id='flag_"+msg_id+"' class='"+class_flag+"' onclick=\"flagMsg("+msg_id+",'"+row_bg_clr+"')\">  <\/a><\/td>";
            html += "<td>"+msg+"&nbsp;"+"<span style='color:gray'>["+msg_id+"]</span><\/td>";
            html += "<td>"+from_grp_abr+"<\/td><\/tr>";

            $("#tbody1").prepend(html);
              //append data to tab2 messages received
             if (to_group == $("#login").val())
             {
               $("#tbody2").prepend(html);
             }

             //append data to tab3 sent messages
             else if (from_group == $("#login").val())
             {
               $("#tbody3").prepend(html);
             }

             if (class_flag == 'flagged')
             {
               $("#tbody4").prepend(html);
             }

             if(to_kind == 3 || from_kind == 3){
                $("#tbody5").prepend(html);
             }

             if(from_group != $("#login").val())
             {
               $("#tbody"+from_group).prepend(html);
             }

             if(to_group != $("#login").val())
             {
               $("#tbody"+to_group).prepend(html);
             }

             last_msg_id = msg_id;
        });
        alternateRows();
        setTimeout('updateMessage()', 3000);
  },
    error: function(){
        setTimeout('updateMessage()', 3000);
    },
    async: false
});
 }

在数据库中插入新消息的函数

function addMessages()
{
 if(document.getElementById('name').value == "")
{
    alert("Missing a sender");
}
else if (document.getElementById('user2').value == "")
{
    alert("Missing a receiver");
}
else if (document.getElementById('msg').value == "")
{
    alert("Missing a message");
}
else {
$.ajax({
    url:'insert.php',
    type:'post',
    data:{name: $("#name").val(), from_user_id:$("#from_user_id").val(),from_grp_id:$("#from_grp_id").val(),user2: $("#user2").val(), to_user_id: $("#to_user_id").val(),to_grp_id:$("#to_grp_id").val(), message:$("#msg").val(), label:$("#label").val()},
    success:function(data)
    {
      if (data == 'new user')
      {
        checkNewRole();
        $("#name").val("");
        $("#user2").val("");
        $("#msg").val("");
        $("#label").val("empty");
      }
      else 
      {
       $("#name").val("");
       $("#user2").val("");
       $("#msg").val("");
       $("#label").val("empty");
      }
    }
});
  }
 }

至于php,它或多或少保持不变。