Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Powiadomienia
DNMX
post 22.02.2022, 09:38:32
Post #1





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 18.09.2021

Ostrzeżenie: (0%)
-----


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?

Ten post edytował DNMX 22.02.2022, 10:47:27
Go to the top of the page
+Quote Post
nospor
post 22.02.2022, 12:06:48
Post #2





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
DNMX
post 22.02.2022, 12:38:17
Post #3





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 18.09.2021

Ostrzeżenie: (0%)
-----


Split() zadziałał, dzięki!
Go to the top of the page
+Quote Post
trueblue
post 22.02.2022, 13:23:40
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


W pliku wynikowym niepotrzebne są informacje "alerty" i "powiadomienia".
Wystarczy postać: 1;2


--------------------
Go to the top of the page
+Quote Post
DNMX
post 22.02.2022, 19:14:00
Post #5





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 18.09.2021

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
trueblue
post 22.02.2022, 22:18:28
Post #6





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


A znasz Google? Pewnie tak...
https://www.google.com/search?q=javascript+meta+tag+title


--------------------
Go to the top of the page
+Quote Post
DNMX
post 24.02.2022, 09:54:46
Post #7





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 18.09.2021

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 24.02.2022, 10:00:43
Post #8





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


W jakim celu zapamiętywać poprzednią liczbę powiadomień?
Pobierasz wartość, doklejasz tytuł i wstawiasz.


--------------------
Go to the top of the page
+Quote Post
DNMX
post 24.02.2022, 10:45:35
Post #9





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 18.09.2021

Ostrzeżenie: (0%)
-----


Doklaejam ale robi mi sie z tego taki infinite loop. Co robie zle?
Go to the top of the page
+Quote Post
trueblue
post 24.02.2022, 10:47:12
Post #10





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Liczba powiadomień>0 ? Liczba powiadomień + tytuł : Tytuł


--------------------
Go to the top of the page
+Quote Post
DNMX
post 24.02.2022, 23:14:56
Post #11





Grupa: Zarejestrowani
Postów: 127
Pomógł: 0
Dołączył: 18.09.2021

Ostrzeżenie: (0%)
-----


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?

Ten post edytował DNMX 24.02.2022, 23:22:38
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 08:44