Mam zamiar zrobić Chat na JavaScript (jQuery, Ajax itp). Wstępnie wychodzę z założenia, że nie chce pobierać kodu HTML rozmów, tylko generować je za pomocą skryptu JS z danych JSON. Za pomocą jQuery oscylować. Wszystko działa, ale też nie w 100% tak jak powinno. Zacznę opisywać:
Chat będzie podzielony na kilka pokoi, jedne będą bardziej popularne, inne mniej, ale to żadna przeszkoda. Tak samo ilość postów jaka będzie wyświetlana to będzie wartość dynamiczna, bo w jednym pokoju może być ich pięć, a w innym dwadzieścia. Nie zależnie od ilości pobieranych postów, trzeba w skrypcie wyróżnić w jaki sposób wyświetlać dane. Jak wiecie w jQuery odróżniamy ciekawe dwie funkcje – appendTo() i prependTo() – pozwalają nam dawać dane na końcu/początku wybranego elementu (w moim przypadku div-a). Trzeba jeszcze wspomnieć, że div w którym będą znajdować się posty – ma on identyfikator shoutboxPosts, a identyfikatory disów w których znajdzie się treść postu to post_[id]. Z góry zakładam, że identyfikatory postów nie mogą się powtarzać. Przy wyświetlaniu danych zakładam dwie sytuację:
1. wyświetlone zostały już jakieś posty
2. nie wyświetlono ani jednego postu
Wiedząc, że posty znajdują się w tablicy data.posts (która zawiera inne tablice zawierające takie dane: id postu, login, treść, data dodania i awatar), odpalam pętlę:
for (var index in data.posts)
W tej pętli na początku do zmiennej $id zapisuję identyfikator obecnego diva, który zostanie utworzony oraz w zmiennej $how zapisuję ilość postów już wyświetlonych:
$id = 'post_'+data.posts[index].id; $how = $('div[id^=post]').length;
Następnym etapem jest utworzenie 2 warunków, żeby wiedzieć czy aktualizować wpisy czy dodawać:
if($how < data.limit) { if($("div[id = '"+$id+"']").length == 0) { $('<div id="'+$id+'"></div>').html(data.posts[index].message).appendTo('#shoutboxPosts'); } } else if($how >= data.limit) { if($("div[id = '"+$id+"']").length == 0) { $("div[id^=post]:last").hide(0, function() { $(this).remove(); { $('<div id="'+$id+'"></div>').html(data.posts[index].message).prependTo('#shoutboxPosts'); } }); } }
Wszystko działa jak należy – jeżeli skrypt jest załadowany od nowa to wszystko fajnie się wyświetla, jeżeli dodam nowy post. Problem jest jak dodam w posty naraz (albo dwóch użytkowników doda w tym samym momencie lub zostaną pobrane nowe dwa wpisy). Pokazują się, a dwa ostatnie zostaną usunięte (żeby postów nie było więcej niż data.limit), jednak te wpisy już nie sortuje po dacie tylko dodaje nowe wpisy na początku głównego diva po koleji, a każdy następny nowy powinien być nad poprzednio popranym nowym. Mam nadzieje, że rozumiecie mój problem… To pokazania mojego problemu załączam screen.

Trzeba będzie pracować na ifie nr dwa czyli if($how >= data.limit)
Bardzo proszę o pomoc