Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Powiadomienia
Forum PHP.pl > Forum > Gotowe rozwiązania > Szukam
DNMX
Szukam kawalka kodu (AJAX) ktory obsuzy mi powiadomienia na stronie tak, ze bedzie w petli powiedzmy co 5 sekund pobieral plik mojastrona.pl/powiadomienia.txt ktory przykladowo wyglada tak:
Cytat
alerty:15;powiadomienia:29;

i na widocznym fragmencie strony zmieni odpowiednie numerki
  1. <span id="alerty" class="badge badge-danger badge-counter">15</span>
  2. ....
  3. <span id="pow" class="badge badge-success badge-counter">29</span>

Z góry dzieki!



Edit: Znalazłem taki fragment kodu:
  1. window.addEventListener('load', function()
  2. {
  3. var xhr = null;
  4.  
  5. getXmlHttpRequestObject = function()
  6. {
  7. if(!xhr)
  8. {
  9. // Create a new XMLHttpRequest object.
  10. xhr = new XMLHttpRequest();
  11. }
  12. return xhr;
  13. };
  14.  
  15. updateLiveData = function()
  16. {
  17. var now = new Date();
  18. // Date string is appended as a query with live data.
  19. // for not to use the cached version.
  20. var url = 'powiadomienia.txt';
  21. xhr = getXmlHttpRequestObject();
  22. xhr.onreadystatechange = evenHandler;
  23. // asynchronous requests
  24. xhr.open("GET", url, true);
  25. // Send the request over the network
  26. xhr.send(null);
  27. };
  28.  
  29. updateLiveData();
  30.  
  31. function evenHandler()
  32. {
  33. // Check response is ready or not
  34. if(xhr.readyState == 4 && xhr.status == 200)
  35. {
  36. dataDiv = document.getElementById('alerty');
  37. // Set current data text
  38. dataDiv.innerHTML = xhr.responseText;
  39. // Update the live data every 1 sec
  40. setTimeout(updateLiveData, 1000);
  41. }
  42. }
  43. });
  44.  

ktory dziala ale nie wiem, jak do spana o id="alerty" wrzucic liczbe 15 a do tego z ID pow 29. Pomozecie?
nospor
Twoje punkty znajduja sie teraz w responseText.
Uzyj wec np https://developer.mozilla.org/en-US/docs/We...ts/String/split by rozdzielic to po sredniku a potem po dwukropku i masz co chciales.
A nastepnym razem zapisuje dane jako JSON, bedzie prosciej wink.gif
DNMX
Split() zadziałał, dzięki!
trueblue
W pliku wynikowym niepotrzebne są informacje "alerty" i "powiadomienia".
Wystarczy postać: 1;2
DNMX
Do tego już też doszedłem smile.gif
A jeszcze chaiłbym, że jeśli liczba alertów będzie większa od 0, to <title> strony zmieni się na "(1) Oryginalny tytuł" a gdy znowu spadnie do 0 to <title> wróci do "Oryginalny tytuł". Czy ktoś poratuje fragmentem kodu również i na to?
trueblue
A znasz Google? Pewnie tak...
https://www.google.com/search?q=javascript+meta+tag+title
DNMX
W google nie znalazłem gotowca. Zmodyfikowałem trochę swój kod:
  1. function evenHandler()
  2. {
  3. // Check response is ready or not
  4. if(xhr.readyState == 4 && xhr.status == 200)
  5. {
  6. notifDiv = document.getElementById('pow');
  7. creditDiv = document.getElementById('alerty');
  8. // Set current data text
  9. const not = xhr.responseText.split(';');
  10. notifDiv.innerHTML = not[0];
  11. <------> if(not[0] > 0) {
  12. <------><------>document.title = "(" + not[0] + ") " + document.title;
  13. <------> }
  14. creditDiv.innerHTML = not[1];
  15. // Update the live data every 1 sec
  16. setTimeout(updateLiveData, 1000);
  17. }
  18. }
  19. });


Domniemuję, że powinienem wproawdzić jakąś zmienną w której zapisane jest, ile wynosiła stara wartośc powiadomień i tylko jeśli się różni to ustawiać nowy tytuł na podstawie starego tytułu + nowej ilości powiadomień ale nie potrafię tego zrobić:
  1. function evenHandler()
  2. {
  3. <------>var oldnot = 0;
  4. <------>var oldtitle = document.title;
  5. // Check response is ready or not
  6. if(xhr.readyState == 4 && xhr.status == 200)
  7. {
  8. notifDiv = document.getElementById('pow');
  9. creditDiv = document.getElementById('alerty');
  10. // Set current data text
  11. const not = xhr.responseText.split(';');
  12. notifDiv.innerHTML = not[0];
  13. <------> if(oldnot != not[0]) {
  14. <------><------>document.title = "(" + not[0] + ") " + oldtitle;
  15. <------><------>oldnot = not[0];
  16. <------> }
  17. creditDiv.innerHTML = not[1];
  18. // Update the live data every 1 sec
  19. setTimeout(updateLiveData, 1000);
  20. }
  21. }
  22. });

Efekt w obu przypadkach jest taki, że co sekundę tytuł zmienia się na:
Kod
(1) tytuł
(1) (1) tytuł
(1) (1) (1) tytuł

itd, itp.
trueblue
W jakim celu zapamiętywać poprzednią liczbę powiadomień?
Pobierasz wartość, doklejasz tytuł i wstawiasz.
DNMX
Doklaejam ale robi mi sie z tego taki infinite loop. Co robie zle?
trueblue
Liczba powiadomień>0 ? Liczba powiadomień + tytuł : Tytuł
DNMX
Ten kod działa tak samo: (1) (1) się nawarstwia. Na razie zastosowałem obejście w postaci metatagu zawierającego to samo co tytuł:
  1. var title = document.querySelector('meta[name="description"]').content;
  2. //Notifications
  3. if(not[0] > 0) {
  4. document.title = "(" + not[0] + ") " + title;
  5. } else {
  6. document.title = title;
  7. }

Działa tak jak trzeba bo liczba powiadomień się nie nawarstwia a po odczytaniu znika.

Zastanawiam się, czy tego fragmentu kodu nie można wykorzystać do przekierowania użytkownika do ekranu logowania gdy skońzy mu się sesja? W pliku mojastrona.pl/powiadomienia.txt który nie jest zwykłym .txt a jest interpretowany przez parser PHP, jest warunek, że jeli user niezalogowany zwraca 0. Próbowałem tam dać:
  1. header("Location /login.php");

czy też:
  1. <meta http-equiv="refresh" content="5; URL=https://www.mojastrona.pl/login.php" />

ale oba powodują tylko to, że zamaist liczby powiadomień wyświetl się "undefined"
Czy można by ten kod wykorzystać również do przekierowania usera do ekranu logowania po wyekspirowaniu sesji?
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-2024 Invision Power Services, Inc.