Mam taki kod:
window.addEventListener('load', function() { var xhr = null; getXmlHttpRequestObject = function() { if(!xhr) { // Create a new XMLHttpRequest object. xhr = new XMLHttpRequest(); } return xhr; }; updateLiveData = function() { var now = new Date(); // Date string is appended as a query with live data. // for not to use the cached version. var url = '/ajax.php'; xhr = getXmlHttpRequestObject(); xhr.onreadystatechange = evenHandler; // asynchronous requests xhr.open("GET", url, true); // Send the request over the network xhr.send(null); }; updateLiveData(); function evenHandler() { // Check response is ready or not if(xhr.readyState == 4 && xhr.status == 200) { const powiadomienie = JSON.parse(xhr.responseText); odpowiedzDiv = document.getElementById('odpowiedz'); odpowiedzDiv.innerHTML = powiadomienie.status; const status = powiadomienie.status; switch(status) { case 0: odpowiedzDiv.innerHTML = "Operator otrzymał Twój kod"; break; case 1: odpowiedzDiv.innerHTML = "Podany przez Ciebie kod jest OK"; break; case 2: odpowiedzDiv.innerHTML = "Kod jest nieprawidłowy"; } // Update the live data every 1 sec setTimeout(updateLiveData, 1000); } } });
"1" !== 1
Dzięki, działa. Klikam pomógł.
Jeszcze jeden problem z użyciem tego skryptu. Zdarza się, że w nocy lub w dzień z zniewiadomych powodów (pewnie dostawca interentu) nie dostanę odpowiedzi od skryptu ?ajax.php. ZAuważyłem, że wtedy odświeżanie danych co 30 sekund przestaje działać. Zmieniałem kod
indow.addEventListener('load', function() { var xhr = null; getXmlHttpRequestObject = function() { if(!xhr) { // Create a new XMLHttpRequest object. xhr = new XMLHttpRequest(); } return xhr; }; updateLiveData = function() { var now = new Date(); // Date string is appended as a query with live data. // for not to use the cached version. var url = '/?ajax.php'; xhr = getXmlHttpRequestObject(); xhr.onreadystatechange = evenHandler; // asynchronous requests xhr.open("GET", url, true); // Send the request over the network xhr.send(null); }; updateLiveData(); function evenHandler() { listsDiv = document.getElementById('lists'); devsDiv = document.getElementById('devices'); // Check response is ready or not if(xhr.readyState == 4 && xhr.status == 200) { <------>const not = JSON.parse(xhr.responseText); // Set current data text <------>listsDiv.innerHTML = not['lists']; <------>devsDiv.innerHTML = not['devices']; var title = document.querySelector('meta[name="statictitle"]').content; <------>//Notifications if(not['newlists'] > 0) { <------>document.title = "(" + not['newlists'] + ") " + title; } else { <------>document.title = title; } setTimeout(updateLiveData, 30000); <------>} else { <------> devsDiv.innerHTML = '<http://december.com/html/4/element/div.html class="col-md-12 themed-grid-col text-white bg-warning">No connection with the Application</http://december.com/html/4/element/div.html>'; <------>} } });
else { <------> devsDiv.innerHTML = '<http://december.com/html/4/element/div.html class="col-md-12 themed-grid-col text-white bg-warning">No connection with the Application</http://december.com/html/4/element/div.html>'; <------>}
Sprawdź co otrzymujesz w xhr.status jeśli serwer nie działa.
Swoją drogą: https://www.w3schools.com/js/js_api_fetch.asp
Nie wiem, czy dobrze sprawdzam, ale konsola Fiefoxa zatrzymuje się na odpowiedzi, która ma 0 bajtów:
https://ibb.co/VJbgf4F
https://imgbb.com/
Przecież zmienną xhr i jej własność status używasz w kodzie.
Ok, dodalem coś takiego
if(xhr.readyState == 4) if(xhr.status == 200) { console.log('ok'); } else if(xhr.status == 0){ console.log('blad'); } }
A w którym miejscu dać to?
devsDiv.innerHTML = '<http://december.com/html/4/element/div.html class="col-md-12 themed-grid-col text-white bg-warning">No connection with the Application</http://december.com/html/4/element/div.html>'; setTimeout(updateLiveData, 30000);
Przecież z tego kodu dokładnie wynika gdzie dodać...
Pierwszą linię dodajesz tam gdzie jest błąd połączenia, bo przecież to ma wskazywać.
Drugą ma cyklicznie wywoływać żądanie, czyli za każdym razem.
Nie dla każdego JS jest takie jasne jak dla Ciebie
Myślę, że nie ma to związku z JS tylko z zasadami programowania.
setTimeout ma być wykonany za każdym razem, więc trzeba go wyprowadzić poza warunki.
Ogarnęłem, dzięki. Klikam pomógł!
Edit: Po czasie okazało się, że taki kod:
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)