Minulla on hieman jQuery-koodia, joka suoritetaan 6 sekunnin välein. Mozilla Firefoxilla toimii moitteettomasti. Internet Explorer 11:llä toimii aluksi OK, mutta jos olen vaikkapa pari tuntia poissa koneelta ja tulen katsomaan IE-selainta, se on lopettanut koodin suorittamisen 6 sekunnin välein. Virheilmoituksia ei tule.
Miten ongelman voisi ratkaista?
<script src="/jquery-3.0.0.min.js"></script> <script type="text/javascript"> <!-- $(document).ready(function(){ valvonta = function() { var kaavio = 106; // 38; var a = performance.now(); jQuery.post("hae_tilanteet.php", { kaavio: kaavio }).done(function(data) { var b = performance.now(); $('#valvonta').html(data); var c = performance.now(); // alert('search ' + (((b - a)/1000)%60) + ' s and update ' + (((c - b)/1000)%60) + ' s'); setTimeout(valvonta, 6000); }); }; setTimeout(valvonta, 6000); }); //--> </script>
Onko tuo done semmoinen että se suoritetaan jos ajax-kutsu onnistuu? Jos tuleekin kerran joku ongelma ja pyynnön tekeminen epäonnistuu niin olisiko mahdollista ettei se enää jatka yrittämistä?
Käyttäisin itse tuon setTimeout-kutsun .done:n sijaan .always-metodia. Sitä kutsutaan vissiin vaikka tulisi virhe. Näin homma jatkuisi eteenpäin.
https://api.jquery.com/jquery.post/
Äkkiseltään ilman testausta jotain seuraavan tapaista
$(document).ready(function(){ valvonta = function() { var kaavio = 106; // 38; var a = performance.now(); jQuery.post("hae_tilanteet.php", { kaavio: kaavio }).done(function(data) { var b = performance.now(); $('#valvonta').html(data); var c = performance.now(); // alert('search ' + (((b - a)/1000)%60) + ' s and update ' + (((c - b)/1000)%60) + ' s'); }).always(function(){ //Kutsutaan uudestaan, oli mikä oli setTimeout(valvonta, 6000); }); }; setTimeout(valvonta, 6000); });
Kiitos hyvästä ajatuksesta, Quirzo! Olettaisin ongelman johtuvan siitä, että selain tai välilehti ei ole aktiivinen, jolloin jQuery-koodia ei ajeta kaikilla selaimilla. Tässä koodi, jolla sain homman toimimaan, kunnes toisin todistetaan.
$(document).ready(function(){ var vasen = 0; setInterval(function() { vasen++; $('#valvonta').stop(true,true).css("left", vasen); var kaavio = 106; // 38; var a = performance.now(); jQuery.post("hae_tilanteet.php", { kaavio: kaavio }).done(function(data) { var b = performance.now(); $('#valvonta').html(data); var c = performance.now(); // alert('search ' + (((b - a)/1000)%60) + ' s and update ' + (((c - b)/1000)%60) + ' s'); }); }, 6000); });
Jos tuo räpellys tulee oikeiden asiakkaiden käyttöön, niin suosittelisin tyytymään selainten päättämään suoritusmalliin. Sen tarkoituksena on varmistaa, ettei yksittäinen webbisivu vie turhaan kaistaa, muistia, virtaa akusta jne. Kikkailemalla aiheutat vain haittaa käyttäjille ja luultavasti temppusi toimivat vain hetken, kunnes selainten oppivat optimoimaan suoritusta paremmin ja sitten koodisi on taas jäähyllä.
The Alchemist, kerro toki parempi ratkaisu, jolla sivu päivittyy ei-aktiivisessa selaimessa/välilehdesä vaikka maailman tappiin asti.
Jos sivusi on jostain syystä sellaisesta toiminnosta riippuvainen, niin olet tehnyt jotain väärin. Kun käyttäjä ei edes ole kiinnostunut kyseisestä välilehdestä, niin ei ole mitään syytä pakottaa päivitystä.
The Alchemist, kerroit koodini olevan räpellys, mutta et kuitenkaan esittänyt toimivaa koodia vastineeksi. Miten itse tekisit saman asian? Sillä ei ole merkitystä, tuleeko tämä todellisuudessa jollekin sivustolle käyttöön vai ei, mutta kiinnostaa tietää, miten tuon voisi fiksuimmin toteuttaa - riippumatta siitä, miten eri selaimet luonnostaan ei-aktiivisia sivuja/välilehtiä päivittävät. Olen kyllä tietoinen, miksi selaimet on optimoitu toimimaan ei-aktiivisten sivujen päivityksen kanssa niin kuin ne on.
Lisätään vielä, että sivuni ei ole riippuvainen ko. toiminnallisuudesta vaan se toimii 100 %:sti ilmankin.
tee suosiolla websocketilla ja unohda nuo intervallipohjaiset pollaukset.. mutta kokeileppa vaikka setIntervalia jos nyt pollaamalla on pakko tehdä. Huomioi kuitenkin se, että tämä kutsu tehdään vain kerran, funktiota kutsutaan maailman tappiin intervallivälein ellei sitä erikseen lopeteta. (Tässä oli aikoinaan IE:ssä muistivuoto-ongelma, joka tosin nykyisin on jo korjattu. vastaisuudessa, jos tarvitset livedataa, käytä sitä websocketia. siksi ne on olemassa.
xxmss kirjoitti:
The Alchemist, kerroit koodini olevan räpellys, mutta et kuitenkaan esittänyt toimivaa koodia vastineeksi. Miten itse tekisit saman asian?
En tarkoittanut, että koodisi olisi itsessään huono, vaan sitä että teet koodista huonon ja potentiaalisesti vika-alttiin, koska itsepintaisesti haluat rikkoa selainten sisäänrakennetut optimoinnit. Ehdottamani ratkaisu ei ollut kirjoittaa saman asian tekevä koodi eri tavalla vaan tyytyä siihen, miten selaimet toimivat, koska siitä ei ilmeisesti ole mitään oikeaa haittaa.
Groovyb:n mainitsemat websocketit olisivat toki yksi tapa kiertää tuota suorituksen jäädyttämistä, koska selaimet eivät keskeytä sellaisen koodin suorittamista, mikä vaikuttaa reaaliaikaiselta. Websocketit vaativat koko ajan auki olevan yhteyden ja siitä syystä selaimet sallivat sellaisen koodin tausta-ajon.
Aihe on jo aika vanha, joten et voi enää vastata siihen.