2015-04-21 14 views
6

Moje pytanie brzmi, jaki jest lepszy sposób na tworzenie komentarzy, jak na StackOverflow, Mam na myśli wysłanie zapytania z mojej przeglądarki i wszyscy zobaczą ten komentarz (lub w innej przeglądarce) bez odświeżania strony jak niektórzy czat.Ajax post comment like StackOverflow

Moje rozwiązanie było użyć setInterval, ale myślę, że musi być inny sposób

$(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) jest ładniejszy niż rozwiązanie setInterval. –

+0

Dodanie 'setInterval' bez usuwania poprzedniego na każdym' # send' brzmi jak niebezpieczny pomysł. 'var tot = parseInt (max - cnt);' zamiast prostego 'var tot = max - cnt;' wygląda dziwnie. 'parseInt (tot) <= 0' zamiast' tot <= 0' również jest dziwne. – Regent

+0

Jeśli znasz technologie .Net, spróbuj tego w SignalR oferuje dobre rozwiązania dla Ciebie. –

Odpowiedz

4

Choć widziałem swój wspomnianego podejścia wykorzystywane do aktualizacji w czasie rzeczywistym, ale to nie jest właściwy sposób to zrobić.

Będziesz musiał użyć gniazd internetowych, które są de facto aplikacjami WWW w czasie rzeczywistym.

gniazda sieci podlegają w sobie i mogę jechać dalej, ale tu jest link, aby zacząć na nich: http://socketo.me

2

Nie trzeba setInterval. Co można zrobić, to tak zwany długi odpytywania:

JavaScript: zdefiniować ajax funkcję, która dzwoni się na Complete:

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: uruchomieniu pętli minutę, który sprawdza każdy 3 sekundy dla nowego wpisu w bazie danych:

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

Żądanie, które zawiesza się na minutę? Niezły pomysł, wiesz. Na przykład może upłynąć limit czasu żądania 30 sekund. Dodatkowo zużywa więcej zasobów serwera ze względu na 'while'. Nie można również zmienić czegoś związanego z żądaniami (aktualizacja dodatkowej siły lub zmienione parametry żądania lub interwał) po stronie klienta podczas żądania z tym podejściem. – Regent

+0

@Regent Nic nie jest doskonałe, ale używam go od lat i działa dobrze, to najprostszy sposób. –

+0

Ale "działa" nie oznacza, że ​​jest dobra (nie mówię o idealnej) drodze. Wyobraźmy sobie, że chcesz sprawdzić, czy masz nowe wiadomości w swojej skrzynce pocztowej, czy nie. Zamiast sprawdzać je raz dziennie, pozostajesz cały dzień blisko skrzynki pocztowej i co godzinę sprawdza nowe wiadomości e-mail. Czy brzmi "OK"? Czy chcesz pozostać blisko skrzynki pocztowej przez cały dzień? – Regent