2009-07-29 44 views
4

好嗨 帮助帮助帮助 我有setTimeout的它是不工作的一个重大问题,我没有工作一切的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; 

?> 

谢谢你们

+0

我会补充我的两分钱如何解决这个问题,但我不清楚,如果你仍然在寻找答案。如果您发现它有帮助,您应该可以接受已经提供的一个。 – Anthony 2009-09-12 09:03:18

回答

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它仍然或多或少是相同的。

1

这是非常不可能的there's anything wrong with setTimeout。您可以通过让updateMsg()在运行时执行某些操作来检查此问题,而不是启动该Ajax请求;做一个alert()或更改页面上的框的颜色,或其他。

如果这是您正在运行的代码,那么最明显的问题就是您的Ajax调用的回调函数为空,因此没有任何操作。

1

它可能没有达到setTimeout()。 在里面放一个alert()。

另外,你应该在回调函数中设置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 */ } 
}); 

} 

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