2015-04-21 10 views
6

Meine Frage ist, was ist besser, Kommentar System wie auf StackOverflow, Ich meine ich Anfrage von meinem Browser zu tun und jeder wird diesen Kommentar (oder in anderen Browser) ohne erfrischende Seite wie einige sehen Plaudern.Ajax Beitrag Kommentar wie StackOverflow

Meine Lösung war setInterval zu verwenden, aber ich denke, es gibt einen anderen Weg geben muss

$(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) ist eine schönere Lösung als setInterval. –

+0

Das Hinzufügen von 'setInterval' ohne vorheriges Löschen jedes' # send' klingt wie eine gefährliche Idee. 'var tot = parseInt (max - cnt);' statt einfach 'var tot = max - cnt;' sieht seltsam aus. 'parseInt (tot) <= 0' anstelle von' tot <= 0' ist auch seltsam. – Regent

+0

Wenn Sie mit .Net-Technologien vertraut sind, versuchen Sie es in SignalR bietet gute Lösungen für Sie. –

Antwort

4

Obwohl ich Ihren oben genannten Ansatz gesehen für die Echtzeit-Updates verwendet wird, aber es ist nicht der richtige Weg, es zu tun.

Sie müssen Web-Sockets verwenden, die de facto für Echtzeit-Webanwendungen sind.

Web Sockets sind ein Thema für sich und ich kann weitermachen, aber hier ist ein Link auf sie zu erhalten begonnen: http://socketo.me

2

Sie nicht setInterval brauchen. Was Sie tun können, ist so lange Polling genannt:

Javascript: Sie Ajax-Funktion definieren, die sich auf vollständig ruft:

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: Sie eine Minute Schleife beginnen, die jedes überprüft 3 Sekunden für den neuen Eintrag in der Datenbank:

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

Anfrage, die für Minute hängt? Keine gute Idee, weißt du? Zum Beispiel haben Sie möglicherweise 30 Sekunden Request-Timeout. Darüber hinaus verbraucht es aufgrund von while mehr Serverressourcen. Sie können auch nicht etwas ändern, das mit Anforderungen (Extra-Force-Update oder geänderte Request-Parameter oder Intervall) auf der Client-Seite während der Anfrage mit diesem Ansatz zusammenhängt. – Regent

+0

@Regent Nichts ist perfekt, aber ich benutze es seit Jahren und es funktioniert OK, das ist der einfachste Weg. –

+0

Aber "es funktioniert" bedeutet nicht, dass es gut ist (ich spreche nicht über perfekt). Stellen wir uns vor, Sie möchten überprüfen, ob Sie neue Mails in Ihrem Postfach haben oder nicht. Anstatt es einmal am Tag zu überprüfen, bleiben Sie den ganzen Tag in der Nähe des Postfachs und es prüft stündlich nach neuen E-Mails. Klingt es "OK"? Möchten Sie in der Nähe Ihres Briefkastens Ihren ganzen Tag verbringen? – Regent