2015-04-21 24 views
6

Soruma göre soru, StackOverflow, gibi yorum sistemi yapmak için daha iyi bir yoldur. Tarayıcımdan istek gönderiyorum ve herkes bu sayfayı (veya başka bir tarayıcıda), bazılarının sohbet.Ajax gönderi yorumuyla StackOverflow

Çözümümün setInterval kullanmak, ama

senin yukarıda belirtilen yaklaşım görmeme rağmen
$(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 daha güzel bir çözümdür. –

+0

'setInterval 'ifadesini, her' #' 'mesajında ​​bir öncekini temizlemeden eklemek tehlikeli bir fikir gibi görünür. var tot = parseInt (max - cnt); 'yerine basit' var tot = max - cnt; 'garip görünüyor. 'tot <= 0' yerine parseInt (tot) <= 0 'da tuhaftır. – Regent

+0

.Net teknolojilerine aşina iseniz, SignalR'de deneyin, sizin için iyi çözümler sunar. –

cevap

4

gerçek zamanlı güncellemeler için kullanılan başka bir yolu olmalı düşünüyorum ama bunu yapmak için doğru bir yol değildir. Gerçek zamanlı web uygulamaları için gerçek olan web soketlerini kullanmanız gerekecektir.

Web yuvaları başlı başına bir konu olan ve devam edebilirim ama burada onlara başlamak için bir link: http://socketo.me

2

Sen setInterval gerekmez. Ne yapabilirsiniz kadar uzun yoklama denir:

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: Her denetler bir dakikalık döngü başlatmak tamamladıktan kendisini aradığını ajax fonksiyonu tanımlamak veritabanındaki yeni giriş için 3 saniye:

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

İstek, hangi dakika için askıda kalıyor? İyi bir fikir değil, biliyorsun. Örneğin, 30 saniyenin isteği zaman aşımına sahip olabilirsiniz. Ek olarak, 'while' nedeniyle daha fazla sunucu kaynağı tüketir. Ayrıca, bu yaklaşımla istek sırasında, istemcinin istekleri ile ilgili bir şeyi (ekstra güç güncelleştirmesi veya değiştirilen istek parametreleri veya aralık) değiştiremezsiniz. – Regent

+0

@Regent Hiçbir şey mükemmel değil, ama yıllardır kullanıyorum ve iyi çalışıyor, bu en basit yol. –

+0

Ama "işe yarıyor", iyi olduğu anlamına gelmez (mükemmel hakkında konuşma) anlamına gelmez. Posta kutunuzda yeni postalarınız olup olmadığını kontrol etmek istediğinizi düşünelim. Günde bir kez kontrol etmek yerine, tüm gün posta kutusunun yanında kalır ve her saat başı yeni postaları yeniden kontrol eder. "Tamam" mı geliyor? Bütün gün posta kutunun yanında kalmak ister misin? – Regent