Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Szukam _ Powiadomienia

Napisany przez: DNMX 22.02.2022, 09:38:32

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. <http://december.com/html/4/element/span.html id="alerty" class="badge badge-danger badge-counter">15</http://december.com/html/4/element/span.html>
  2. ....
  3. <http://december.com/html/4/element/span.html id="pow" class="badge badge-success badge-counter">29</http://december.com/html/4/element/span.html>

Z góry dzieki!

https://imgbb.com/

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?

Napisany przez: nospor 22.02.2022, 12:06:48

Twoje punkty znajduja sie teraz w responseText.
Uzyj wec np https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/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

Napisany przez: DNMX 22.02.2022, 12:38:17

Split() zadziałał, dzięki!

Napisany przez: trueblue 22.02.2022, 13:23:40

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

Napisany przez: DNMX 22.02.2022, 19:14:00

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?

Napisany przez: trueblue 22.02.2022, 22:18:28

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

Napisany przez: DNMX 24.02.2022, 09:54:46

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.

Napisany przez: trueblue 24.02.2022, 10:00:43

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

Napisany przez: DNMX 24.02.2022, 10:45:35

Doklaejam ale robi mi sie z tego taki infinite loop. Co robie zle?

Napisany przez: trueblue 24.02.2022, 10:47:12

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

Napisany przez: DNMX 24.02.2022, 23:14:56

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. http://www.php.net/header("Location /login.php");

czy też:
  1. <http://december.com/html/4/element/meta.html 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?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)