我的问题是,在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>');
}
});
}
答案 0 :(得分:4)
虽然我已经看到您使用上述方法进行实时更新,但这不是正确的方法。
您需要使用实际Web应用程序事实上的Web套接字。
Web套接字本身就是一个主题,我可以继续前进,但这里有一个链接可以帮助您开始使用它们:http://socketo.me
答案 1 :(得分: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
}
}