2009-07-29 6 views
4

Ok Привет Помощь помощь помощь Я имею большую проблему с SetTimeout он не работает, и я сделал все, что не работаетSetTimeout с Ajax чат

Я developping систему чата, так что мне нужно отправлять и получать сообщения (я проверить его, открыв окна 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

+0

Вы хотите, чтобы вызов ajax каждые семь секунд? Или только через семь секунд? setTimeout для одного вызова и setInterval для многих. –

+0

Большое вам спасибо за вашу заботу Кейн. Я уже решил эту проблему, и теперь я опубликую решение. – Sarah

ответ

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(). Включите предупреждение().

Кроме того, вы должны иметь функцию 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 */ } 
}); 

} 

Это не решает проблему, но он будет решать проблемы, вы будете иметь в дальнейшем. Вам также потребуется обработать неудавшиеся запросы.

Смежные вопросы