Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax] automatyczne odświeżanie
Forum PHP.pl > Forum > Przedszkole
d.stp
Jak zrobić automatyczne odświeżanie np. co 15 sekund? Chodzi mi o autorski skrypt czata
masahuku
Zależy czego. Ogólnie do wykonywania jakiś operacji po stronie klienta (jak np. odświeżanie całej lub części witryny) wykorzystuje się JS'owe cudo: setInterval.

http://www.w3schools.com/jsref/met_win_setinterval.asp
msm
Tu jest przykład odświeżenia części strony div'a co x czas.
jaslanin
lepiej używać setTimeout: http://zetafleet.com/blog/why-i-consider-setinterval-harmful

  1. function myTimeoutFunction()
  2. {
  3. doStuff();
  4. setTimeout(myTimeoutFunction, 1000);
  5. }
  6.  
  7. myTimeoutFunction();
d.stp
Dzięki o to mi chodziło. Użyłem setTimeout i działa dobrze.

Teraz chciałbym zablokować możliwość pisania przed minięciem 3 sekund od poprzedniej wiadomości. Próbowałem coś z delay(), ale to chyba tutaj się nie sprawdzi.

I wie ktoś czy AJAX ma jakiś wpływ na brak polskich znaków? Mam kodowanie plików na utf-8, bazę utf8_general_ci + mysql_query("SET NAMES UTF8"), a dalej nie mam polskich znaków w wiadomościach.
markonix
Cytat(d.stp @ 23.09.2012, 21:20:06 ) *
Teraz chciałbym zablokować możliwość pisania przed minięciem 3 sekund od poprzedniej wiadomości. Próbowałem coś z delay(), ale to chyba tutaj się nie sprawdzi.

W jaki sposób dodajesz wpisy? Tradycyjnie (formularz) czy ajaxem?
d.stp
mam takie coś:
[JAVASCRIPT] pobierz, plaintext
  1. function chat_send() {
  2.  
  3. var msg = document.getElementById("chat_msg").value;
  4.  
  5. $.post('./chat.php', {msg:msg}, function(data){
  6. document.getElementById("chat_msg").value = '';
  7. chat_load();
  8. });
  9.  
  10. }
[JAVASCRIPT] pobierz, plaintext

a w PHP zwykłe zapytanie do bazy
markonix
Wystarczy utworzyć zmienną która będzie zawierała czas unix i porównywać przy wysyłaniu.
Jeśli różnica mniejsza niż 3 sekundy odpowiedni alert czy inny komunikat.

Można też po stronie PHP dodatkowo ale myślę, że to wystarczy spokojnie.
d.stp
Chyba źle szukam bo nie mogę nic znaleźć na temat unix time... zrobiłem to na sekundach, ale coś jest nie tak bo nie działa...

Chyba źle to w ogóle robię biggrin.gif

[JAVASCRIPT] pobierz, plaintext
  1. var d = new Date();
  2. var aktualnyczas = d.getSeconds();
  3. var czaspo = aktualnyczas+3;
  4.  
  5. if (czaspo < aktualnyczas) {
  6. alert('zaczekaj');
  7. }
  8. else { // wyslij }
[JAVASCRIPT] pobierz, plaintext
markonix
10 sekund zajęło mi znalezienie funkcji w JS zwracającej czas unix (nie znałem jej).

[JAVASCRIPT] pobierz, plaintext
  1. new Date().getTime();
[JAVASCRIPT] pobierz, plaintext

Czas unix ale w milisekundach więc albo podziel przez 1000 albo przy warunku zamiast 5 (sekund) daj 5000 (milisekund).
d.stp
Dobra, ale to i tak nie działa
[JAVASCRIPT] pobierz, plaintext
  1. function chat_send() {
  2.  
  3. var aktualnyCzas = new Date().getTime();
  4.  
  5. if (aktualnyCzas < 5000) {
  6. alert('Odczekaj');
  7. }
  8. else {
  9. var text = document.getElementById("chat_text").value;
  10.  
  11. $.post('./chat.php', {stage:"send", text:text}, function(data){
  12. document.getElementById("chat_text").value = '';
  13. chat_load();
  14. });
  15.  
  16. }
  17.  
  18. }
[JAVASCRIPT] pobierz, plaintext

Nie wyskakuje alert, wiadomość się wysyła
ArekJ
[JAVASCRIPT] pobierz, plaintext
  1. if (aktualnyCzas < 5000) {
[JAVASCRIPT] pobierz, plaintext

zamień na
[JAVASCRIPT] pobierz, plaintext
  1. if (aktualnyCzas < aktualnyCzas + 5000) {
[JAVASCRIPT] pobierz, plaintext

Czy jak tam w JS się wykonuje obliczenia na liczbach i zmiennych.
W każdym razie to błąd logiczny tongue.gif
d.stp
Teraz nie mogę wysłać wiadomości bo za każdym razem wyskakuje alert smile.gif
markonix
Cytat(d.stp @ 24.09.2012, 13:49:32 ) *
Teraz nie mogę wysłać wiadomości bo za każdym razem wyskakuje alert smile.gif

A znasz coś takiego jak pojęcie debugowania + samodzielności?

Warunek jest po prostu źle skontrowany więc co problem na niego popatrzeć i poprawić zamiast lecieć z tym na forum.

W skrócie powinien sprawdzać czy różnica między aktualnym czasem unix, a czasem wysłania ostatniej wiadomości jest mniejsza od określonej wartości. Pogrubione przerób na konkretne zmienne i symbole i masz skrypt.
d.stp
... nie wiem naprawdę jak to zrobić
[JAVASCRIPT] pobierz, plaintext
  1. function chat_send() {
  2.  
  3. var d = new Date();
  4. var czas_aktualny =d.getTime();
  5.  
  6. var czas_wyslania_ostatniej_wiadomosci = 0;
  7.  
  8. if (czas_aktualny < czas_wyslania_ostatniej_wiadomosci) {
  9. alert('Odczekaj');
  10. }
  11. else {
  12. var text = document.getElementById("chat_text").value;
  13.  
  14. $.post('./chat.php', {stage:"send", text:text}, function(data){
  15. czas_wyslania_ostatniej_wiadomosci = czas_aktualny + 5000;
  16. document.getElementById("chat_text").value = '';
  17. chat_load();
  18. });
  19. }
  20.  
  21. }
[JAVASCRIPT] pobierz, plaintext


heh, wystarczyło przenieść ustawienie zmiennej poza funkcje wink.gif
melkorm
1. Każde odpalenie funkcji chat_send ustawia zmienne na nowo, więc w takiej postaci jak to teraz jest zrobione - nigdy nie zadziała.
2. W Twoim przykładzie pierwszy warunek NIGDY nie przejdzie, z oczywistych powodów mam nadzieję.
3. Wywal definicję zmiennej czas_wyslania_ostatniej_wiadomosci nad funkcję.
4. Przy wysyłaniu nie dodawaj tych 5 sekund, rób to w pierwszym warunku.
5. W pierwszym warunku dodaj lub czas_wyslania_ostatniej_wiadomosci równy jest zero.

Jeżeli wykonasz te wszystkie punkty to wydaje mi się że powinno działać, jeżeli nie to na pewno będzie bardziej poprawne niż jest to teraz.
d.stp
Dzięki za odp. ale sam na to wpadłem biggrin.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.