2015-04-21 16 views
6

La mia domanda è, qual è il modo migliore per fare sistema di commenti come StackOverflow, Voglio dire che invio richiesta dal mio browser e tutti vedranno questo commento (o in altri browser) senza aggiornare la pagina come alcuni Chiacchierare.Ajax post commento come StackOverflow

La mia soluzione era quella di utilizzare setInterval, ma credo che ci deve essere un altro modo

$(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) è una soluzione più bello di setInterval. –

+0

L'aggiunta di 'setInterval' senza cancellare quella precedente su ogni' # send' sembra un'idea pericolosa. 'var tot = parseInt (max - cnt);' invece di semplice 'var tot = max - cnt;' sembra strano. 'parseInt (tot) <= 0' invece di' tot <= 0' è strano. – Regent

+0

Se hai familiarità con le tecnologie .Net, provalo in SignalR ti offre buone soluzioni. –

risposta

4

Sebbene abbia visto il suo approccio di cui sopra in uso per gli aggiornamenti in tempo reale, ma non è il modo corretto per farlo.

Sarà necessario utilizzare socket Web che sono di fatto le applicazioni Web in tempo reale.

prese sul web sono un argomento in se stesso e posso andare avanti, ma ecco un link per iniziare su di loro: http://socketo.me

2

Non è necessario setInterval. Cosa si può fare è così chiamato polling lungo:

Javascript: si definisce la funzione ajax che si sta chiamando sul completo:

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: si avvia un ciclo di un minuto, che controlla ogni 3 secondi per la nuova voce nel database:

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

Richiesta, che si blocca per minuto? Non è una buona idea, lo sai. Ad esempio, potresti avere un timeout della richiesta di 30 secongs. Inoltre, consuma più risorse del server a causa di 'while'. Non è inoltre possibile modificare qualcosa relativo alle richieste (aggiornamento extra-force o parametri o intervalli di richiesta modificati) sul lato client durante la richiesta con questo approccio. – Regent

+0

@Regent Niente è perfetto, ma lo uso da anni e funziona OK, questo è il modo più semplice. –

+0

Ma "funziona" non significa che sia buono (non parlo di perfetto) modo. Immaginiamo che tu voglia controllare se hai nuovi messaggi nella tua casella di posta o no. Invece di controllarlo una volta al giorno, rimani tutto il giorno vicino alla casella di posta, e ricontrolla la posta ogni ora. Suona "OK"? Vuoi stare vicino alla cassetta postale per tutta la giornata? – Regent