2015-04-21 3 views
6

Мой вопрос в том, что лучший способ сделать систему комментариев, например, на StackOverflow, Я имею в виду, что я отправляю запрос из своего браузера, и каждый будет видеть этот комментарий (или в другом браузере) без обновления страницы, чат.Комментарий к сообщению 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>'); 
     } 
    }); 
} 
+9

[WebSockets] (https://developer.mozilla.org/en/docs/WebSockets) является решением, чем лучше setInterval. –

+0

Добавление 'setInterval', не очищающее предыдущий на каждом' # send', звучит как опасная идея. 'var tot = parseInt (max - cnt);' вместо простого 'var tot = max - cnt;' выглядит странно. 'parseInt (tot) <= 0' вместо' tot <= 0' также странно. – Regent

+0

Если вы знакомы с. Net-технологиями, попробуйте в SignalR, вы получите хорошие решения для вас. –

ответ

4

Хотя я видел ваш вышеупомянутый подход используется для обновления в реальном времени, но это не правильный способ сделать это.

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

веб сокеты являются предметом самого по себе, и я могу продолжать идти, но вот ссылка, чтобы вы начали на них: http://socketo.me

2

Вам не нужно setInterval. Что вы можете сделать, это так называемый длинный опрос:

Javascript: вы определяете АЯКС функцию, которая вызывает себя на полное:

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 secongs. Кроме того, он потребляет больше ресурсов сервера из-за 'while'. Вы также не можете изменить что-то, связанное с запросами (дополнительное усилие, обновление или изменение параметров запроса или интервала) на стороне клиента во время запроса с помощью этого подхода. – Regent

+0

@Regent Ничто не идеально, но я использую его в течение многих лет, и он работает нормально, это самый простой способ. –

+0

Но «это работает» не означает, что это хорошо (я не говорю об идеальном). Представим себе, что вы хотите проверить, есть ли у вас новые письма в вашем почтовом ящике или нет. Вместо того, чтобы проверять его один раз в день, вы остаетесь весь день рядом с почтовым ящиком, и каждый час он перечитывает новые письма. Звучит ли «ОК»? Вы хотите остаться рядом с почтовым ящиком в течение всего дня? – Regent

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