Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][AJAX]Manipulacja paskiem przewijania i odświerzanie diva
Forum PHP.pl > Forum > Przedszkole
piotrek4team
Witam. Mam następujący problem. Napisałem shoutboxa który jest podzielony na 2 div'y. W jednym z nich jest tresc rozmowy która odświeza się co 10 s. Skrypt jest napisany w ajaxu:
  1. var object = false;
  2. if (window.XMLHttpRequest) object = new XMLHttpRequest();
  3. else if (window.ActiveXObject) object = new ActiveXObject("Microsoft.XMLHTTP");
  4. function getData(dataSource, divID)
  5. {
  6. if (object.readyState==4 || object.readyState==0)
  7. {
  8. var obj = document.getElementById(divID);
  9. object.open("GET", dataSource);
  10. object.onreadystatechange = function()
  11. {
  12. if (object.readyState == 4 && object.status == 200)
  13. obj.innerHTML= object.responseText;
  14. }
  15. object.send(null);
  16. }
  17. }
  18. function odswiezaj()
  19. {
  20. getData('sb_read.php', '2');
  21. setTimeout("odswiezaj()", 10000);
  22. }


Odrazu mówię że w ajaxu jestem niestety zielony, a ten skrypt znalazlem na necie... I teraz chodzi mi o to, żeby podczas odświezania nie wyrzucało diva do góry (pasek przewijania). Najlepiej gdyby było tak, że jakoś javascript zapisuje pozycję paska przed odświezaniem i po odswiezeniu przywraca wcześniejszą. Myślałem coś o scrollTop() ale nie wiem jak to poskładać do kupy...
Z góry dzięki za poomoc smile.gif
Maxik
Jeśli chodzi o przewinięcie diva na koniec to:
Kod
var objDiv = document.getElementById("main-window");
objDiv.scrollTop = objDiv.scrollHeight;
kamil4u
Kiedyś pisałem shoutbox-a - jak zwykle nie dokończyłem : http://www.kamil.contrel.pl/shoutbox/

Załóżmy, że błędy to wiadomości, zobacz jak zachowuje się pasek - popatrz w źródło i przekopiuj sobie kod, jak Ci się spodoba smile.gif
piotrek4team
Mam jeszcze problem z tym kode od kamila dry.gif (jeszcze raz dzięki za pomoc smile.gif )
Chodzi o to że zamiast pojedyńczych wiadomości, ajax zwraca mi całego shoutboxa i co 3s tworzy nowego... Czyli że 1 shoutbox .. 3s ... 2shoutbox'y itd.
Chciałbym żeby zamiast całego shoutboxa on tak samo traktował pojedyńcze wiadomości... Myślałem o tym żeby zmienić to co odświeza ajax ze string na array i wtedy pojedyńcze pole tablicy było by jedną wiadomością i zarówno obiektem czy jakoś tak... wtedy ajax by brał nie całego shouta, lecz pojedyńcze wiadomości.
Chodzi mi o to, żeby poprostu uzyskać taki efekt, jaki jest w przykładzie kamila smile.gif tylko nie wiem jak to zrobić sadsmiley02.gif próbowałem cos ze split() ale nie wyszło...
oto ten kod:
  1. function show()
  2. {
  3. var scroll_height = document.getElementById('1').scrollHeight;
  4. var scroll;
  5.  
  6. if(document.getElementById('1').scrollTop+400 == scroll_height && scroll_height > 405)
  7. scroll = true; else scroll = false;
  8.  
  9. var xmlHttp = mint.Request();
  10. xmlHttp.OnSuccess = function()
  11. {
  12. var test = this.responseText;
  13. var span = document.createElement('span');
  14. span.className = 'text';
  15. span.innerHTML = test;
  16. document.getElementById('1').appendChild(span);
  17. // document.getElementById('1').innerHTML = this.responseText;
  18.  
  19. if(scroll) document.getElementById('1').scrollTop = scroll_height;
  20. }
  21.  
  22. xmlHttp.Send("sb_read.php");
  23.  
  24. setTimeout("show()", 3000);
  25. }
kamil4u
Bo IMO trochę źle to robisz -może ja zrobiłem, ale to dawno było to się nie liczy smile.gif

Najlepiej jakbyś zrobił to tak:
- co Xs AJAX wysyła żądanie do skryptu PHP przekazując mu dane o ostatnim żądaniu(data)
- skrypt PHP wyciąga z czegoś(z bazy? Ale IMO można lepiej - pomyśl może coś wymyślisz smile.gif) wyniki od ostatniego żądania - przekazanego przez JS
- wynik z powrotem zwracasz do JS, która dokleja tylko otrzymane dane smile.gif

Pozdrawiam smile.gif

PS. ID nie może być liczbą smile.gif
piotrek4team
ok spróbuje coś jeszcze zrobić tongue.gif napisze potem czy mi się udało smile.gif

No mam już pomysł, tylko napotkałem jeszcze na taki problem i nie mogę znaleźć na niego w necie rozwiązania... smile.gif Chciałbym zapisać dane z pliku sb_read.php do jakiejś zmiennej w js. Alert pokazuje mi tylko Undefined...

  1. function getData() {
  2. var req = mint.Request();
  3. req.Send("sb_read.php", "all");
  4. var mes = this.responseText;
  5. alert(mes);
  6. }
  7. function Message() {
  8. var req = mint.Request();
  9. req.SendForm("sb_form", "sb_send.php");
  10. odsw();
  11. text.value = '';
  12. text.focus();
  13. }

co jest nie tak?? smile.gif
Maxik
Może req.responseText?
krzysiekk
moze produkcja kolegi z forum bedzie przydatna

box
piotrek4team
req.responseText też nie działa :/ ale jest już inaczej, bo wartość nie jest Undefined, tylko NULL tongue.gif tak, czy tak nie działa biggrin.gif
wydaje mi się że problem tkwi w tym, że jak ajax wysyła żądanie do serwera, to odrazu próbuje odczytać responseText, który w tej chwili jest pusty...
Maxik
Jak jest null to sprawdź czy sb_read.php coś zwraca.
piotrek4team
zwraca winksmiley.jpg sama w sobie funkcja getData() też działa (oprócz 2 ostatnich linijek) smile.gif
Maxik
Wywal drugi parametr z Send, on wtedy wstawia odpowiedź do diva o tym ID i responseText może już być null.
piotrek4team
hehe udało mi się winksmiley.jpg problem tkwił w tym że nie użyłem funkcji OnSuccess() tongue.gif
  1. function getData() {
  2. var req = mint.Request();
  3. req.OnSuccess = function() {
  4. var mes = req.responseText;
  5. alert(mes);
  6. }
  7. req.Send("sb_read.php", "all");
  8. }


i teraz wszystko działa winksmiley.jpg ale dzięki wszystkim tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.