Ajax发表评论,如StackOverflow

时间:2015-04-21 07:51:31

标签: php jquery ajax

我的问题是,在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>');
        }
    });
}

2 个答案:

答案 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
    }
}