2015-04-21 25 views
6

我的问题是,有什么更好的方式来做评论系统就像在StackOverflow, 我的意思是我发送请求从我的浏览器,每个人都会看到这个评论(或在其他浏览器)没有刷新页面像一些聊天。阿贾克斯发表评论喜欢StackOverflow

我的解决办法是使用setInterval,但我认为必须有另一种方式

$(document).ready(function() { 
get(); 
$('#send').click(function() { 
    $.post('http://localhost/mvc.com/comment/post', { 
     n_id: parseInt(newsId), 
     user_id: $('#uid').val(), 
     text: $('#content').val(), 
     token: $('#token').val() 
    }, function (ret) { 
     if (ret.comm.err) { 
      $('.f').empty().prepend('<li id=e><h3 style="color: red">ERROR</h3></li>'); 
      return false; 
     } 
     get(); 
    }); 
    setInterval(get,3000); 
}); 

$('#content').keypress(function(e){ 
    var key = e.which; 
    var cnt=$(this).val().length; 
    var max=100; 
    var tot=parseInt(max-cnt); 
    if(key >= 33 || key == 13 || key == 32) { 
     if (parseInt(tot) <= 0) { 
      e.preventDefault(); 
     } 
    } 
}); 

function get() { 
    $.post('http://localhost/mvc.com/comment', {get: parseInt(newsId)}, function (ret) { 
     $('.f').empty(); 
     for (var key in ret.comm) { 
      $('.f').append('<li class=c id=' + ret.comm[key].id + 
      '><span>' + ret.comm[key].name + '</span><hr><br>' + ret.comm[key].text + '</li>'); 
     } 
    }); 
} 
+9

[WebSockets的](https://developer.mozilla.org/en/docs/WebSockets)比的setInterval一个更好的解决方案。 –

+0

在每个'#send'上添加'setInterval'而不清除前面的''''听起来像是一个危险的想法。 'var tot = parseInt(max - cnt);'而不是简单的'var tot = max - cnt;'看起来很奇怪。 'parseInt(tot)<= 0'而不是'tot <= 0'也很奇怪。 – Regent

+0

如果您熟悉.Net技术,请尝试在SignalR中为您提供良好的解决方案。 –

回答

4

虽然我已经看到了你的上述方法被用于实时更新,但它不这样做的正确方法。

您将需要使用实时Web应用程序事实上的Web套接字。

网络套接字本身就是一个问题,我可以继续下去,但这里是一个链接,让你开始对他们说:http://socketo.me

2

你不需要的setInterval。你可以做的就是所谓的长轮询:

的Javascript:你定义一个自称在完整AJAX功能:

function poll(){ 
    $.ajax({ 
     type: "POST", 
     url: url, 
     data: data, 
     success: function(msg){ 
      update_poll(msg);//here you update your span, div, whatever what contains this comment 
     }, 
     dataType: "text", 
     complete: function(){ 
      poll();//here you call it again 
     } 
    }); 
} 
$(document).ready(function(){ 
    poll();//call it just once 
}); 

PHP:你开始一分钟的循环,检查每一个3秒在数据库中的新条目:

if(isset($_POST['n_id'])){ 
    $n_id = (int) $_POST['n_id']; 
    $time = time(); 
    while((time() - $time) < 60) { 
     $last entry = get_last_entry($n_id); 
     if($last entry){ 
      echo $last_entry;//if found new entry, echo it out and break the loop 
      break; 
     } 
     sleep(3);//wait 3 seconds 
    } 
} 
+0

请求,其中挂起的分钟?不是一个好主意,你知道。例如,您可能有30个超时请求超时。另外,由于'while',它消耗更多的服务器资源。在使用此方法的请求期间,您也不能在客户端更改与请求相关的内容(强制更新或更改的请求参数或时间间隔)。 – Regent

+0

@Regent没有什么是完美的,但我一直在使用它多年,它的工作正常,这是最简单的方法。 –

+0

但它“有效”并不意味着它是好的(我不谈论完美)的方式。假设您想要检查邮箱中是否有新邮件。而不是每天检查一次,你整天呆在邮箱附近,并且每小时重新检查新邮件。它听起来“OK”吗?你想整天呆在邮箱附近吗? – Regent