09. februar 2006 - 09:43Der er
23 kommentarer og 3 løsninger
Min uendeligelige lykke registrerer ikke setTimeout()
Hej Alle Jeg har brug for en uendelig lykke. Hvis der har været keypress skal update.php efter 5 min åbnes og opdatere DB for at registrere at siden stadig er aktiv. Update page lukkes umiddelbart efter at den blev åbnet. Af en el. anden grund venter løkken ikke de 5 min. Det medfører at grundsiden aldrig bliver indlæst. >Her er koden.
keypress = false; time_tid = 5*6*1000; function time_out(){ if (keypress) window.showModelessDialog("update_time.php?userID=21&sagID=5","","dialogHeight:100px;dialogLeft:0;dialogTop:0;dialogWidth:100px;scroll:no;edge:sunken;help:no;status:no;unadorned:yes keypress = false; return true; } function update_time(){while(true){setTimeout("time_out();",time_tid);} } document.onload = update_time();
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Personligt er jeg ganske interesseret i uendelig lykke - det lyder lovende!
Derimod undrer jeg mig rigtig meget over, at du bruger en uendelig løkke til at opnå ovenstående - uendelige løkker er sjældent gode i diverse scriptingsprog. Hvad er det lige, den skal gøre?
Umiddelbart skal du vel bare lave en timeout til at gå videre til en ny side i starten og nulstille denne timeout hver gang, der bliver trykket på en tast.
Hej Barklund. Jeg mener vi tidligere har tjattet om problemet. Det var mig med sessions. Se http://www.eksperten.dk/spm/685715. Meningen er hvert 5. minut at informere server om at browseren er åben. Når jeg kikker nøjere efter kan keypress godt undværes. Om jeg bruger en hidden frame el. åbner et nyt windue har ingen indflydelse. Det har jeg testet ved at sætte // foran "if (keypress){ ...". Brugers side skal altså fortsætte med at være åbnet og uforstyret selvom opdatering af DB foretages.
Når jeg laver //document.onload = update_time(); Bliver siden vist - men update_time() kører selvfølgelig ikke. Jeg skrev time_tid = 5*6*1000;. Det skulle selvfølgelig være time_tid = 5*60*1000; men time_tid er under alle omstændigheder stor nok til at registrere problemet. Mvh Christian Ps: jeg ved godt uendelige løkker er farlige, men de kan også være anvendelige. Som f.eks. her hvor det er meningen at den kun skal stoppe hvis siden forlades el. browseren lukkes.
Men skal du ikke bare lave et interval, der åbner et vindue hvert 5. minut og ikke andet? Hvad skal den uendelige løkke gøre? Så vidt jeg kan se, så starter du uendeligt og hele tiden et nyt interval, der skal åbne et vindue om fem minuter - hvilket betyder at om fem minutter skal der åbnes uendeligt mange vinduer.
Jeg kan virkelig ikke se, hvad løkken skal bruges til... :)
Jeg ville gøre noget à la det, jeg har på denne side, nemlig en lille iframe, der hvert 5. sekund undersøger om der er kommet nye indlæg (en Pro-feature !-)
-- hvis du laver en (skjult !-) iframe, kan du i den reloade dokumentet hvert 5. minut, f.eks. sådan:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <noscript> <meta http-equiv="Refresh" content="300;URL=http://www.dinside.dk/update_time.php?userID=21&sagID=5"> </noscript> <title>Online</title> <script type="text/javascript"> setTimeout("location.reload(true)",300000); </script> </head> <body></body> </html>
-- og den er lavet dobbelt, så ikke-script-brugere også får reloadet, der vil den bare også klikke !o]
Som jeg nævnte har jeg udeladt variablen keypress da den faktisk er unødvendig.
->>softspot: På en anden side hvor siden bare skal opdateres har jeg anvendt function update_page(){ tid = 5*60*1000; setTimeout( "document.updater.submit();",tid); // 'updater' er en form der indeholder diverse data. return true; } document.onload = update_page(); Det fungerer fint. Jeg kunne gøre det samme men sætte target="skjult_iframe" istedet for "_self". Men hvordan får jeg den uendelige lykke med kald til update_tid.php hvert 5. min. til at køre?
->> Roenving Jeg forstår ikke helt <meta>-delen og dette med at 'den er lavet dobbelt'. Er det ikke nok bare at skrive location.reload()? <noscript> <meta http-equiv="Refresh" content="300;URL=http://www.dinside.dk/update_time.php?userID=21&sagID=5"> </noscript>
->> Barklund Selvfølgelig - en kopifejl af tidligere fejl. Istedet er det "while (timeout()){test=0;}" og setTimeout() placeret i time_out() som "setTimeout("window.showModelessDialog("...",time_tid);". Formålet er: At sikre at nye brugere af siden får begrænset adgang hvis en anden allerede har åbnet siden. Hvert 5. minut opdatereres DB om at siden er i brug. 5. min efter at browseren er lukket el. en ny side er åbnet kan nye brugere altså få fuld rettighed på siden.
-- .reload(true) skulle betyde, at browseren altid requester en ny side fra serveren (men det kan vist i nogle browsere overrides med brugerindstillinger !-)
-- noscript meta-tagget er kun med for at sikre, at det også sker hos brugere, der af den ene eller anden grund har disablet javascript ...
At nedenstående fungerer fint, skyldes nok mere held end noget andet. I dette tilfælde er kaldet til update_page jo ikke afhængig af at blive aktiveret af onload-eventet og det fungerer derfor at du bare kalder funktionen på renderingstidpsunktet(som du gør).
function update_page(){ tid = 5*60*1000; setTimeout( "document.updater.submit();",tid); // 'updater' er en form der indeholder diverse data. return true; } document.onload = update_page();
Hvis du derimod vil have kaldet til rent faktisk at sket på onload-tidspunktet, så skal du altså undlade at efterstille funktionen med parantes. Således:
function update_page(){ tid = 5*60*1000; setTimeout( "document.updater.submit();",tid); // 'updater' er en form der indeholder diverse data. return true; } document.onload = update_page;
Det kan være du vil opleve det mere konkret, hvis du prøver at flytte funktione ned i en script-sektion for sig selv EFTER denne linie:
->>Roenving Jeg kan godt se din løsning er elegant. Jeg vil kraftigt overveje den. Er <noscript> nødvendig? Kan men ikke bare helt udelade JavaScriptet udelukkende lave refrech med <meta>-taget? Jeg anvender udelukkende window.showModelessDialog fordi jeg så kan SE at det fungerer. Når udvikling er slut skal der anvendes iframe.
->>Softspot Følgende fungerer fint. Et vindue åbnes efter 5 sek. og update.php lukker sig selv efter 3 sekunder.
time_tid = 5*1000; function open_update(){ link = "update_time.php?userID=22&sagID=5&ny=5"; ?> window.showModelessDialog(link,"","dialogHeight:100px ... ); return true; } function time_out(){ var u = setTimeout("open_update()",time_tid); return true; } function update_time(){ time_out(); time_tid = 5*1000;} ... <body> <script language="JavaScript" type="text/javascript"> update_time(); </script> ...
Hvis jeg derimod omskriver update time til:
function update_time(){while(time_out){ test = 0; }}
Følgende fungerer: function update_time(){while(time_out){ time_tid = 5*1000; }}
Hvis jeg derimod omskriver update time til: function update_time(){ while(time_out()){ time_tid = 5*1000; } }
så indlæses update.php ikke hvert 5. sekund som jeg ville forvente. Istedet går siden i selvspind ved opstart. Hvordan kan det være? Hvad skal jeg gøre anderledes?
Og lige et lille spørgsmål til. I har alle været mig til stor hjælp. Kan man tilskrive sit spørgsmål flere point. F.eks. 30 så i alle kan få rigeligt når i om lidt smider et SVAR. Mvh Christian
Til 16:06:08, hvorfor vil du skrive det om til en løkke? Fordi du vil have den til at blive ved med at åbne efter 5 sekunder? Du kan da bare sætte din timeout igen efter du har åbnet en gang? Eller sætte et interval, så den kører konstant efter x tid til du stopper den.
Det er stadigvæk helt grundlæggende forkert brug af en løkke. Den har intet at gøre der. Kan du ikke bare skrive:
function open_update(){ var link = "update_time.php?userID=22&sagID=5&ny=5"; window.showModelessDialog(link,"","dialogHeight:100px ... ); return true; } var time_tid = 5*1000; var u = setInterval("open_update()",time_tid);
Hej alle tre. Nu skal jeg ikke belaste jer mere. Jeg valgte Roenvigs løsning, den virker jo. Men jeg syntes i alle skal smide et SVAR. I har lært begynderen en masse.
->> Roenvig
Jeg prøvede dit forslag. Virkede desvære ikke. Jeg tror det er noget med dette while-statement, men hvad ved jeg ikke.
->> Barklund
Har jeg ikke nævnt meningen? Sorry. Det drejer sig om brugerretigheder. Problemet er at: 1) User1 åbner problem.php for at arbejde med en opgave, løser problemet og registrer det som afsluttet. 2) User2 åbner problem.php efter user1 men før user1 afslutter, løser også problemet, og afslutter det. 3) Serveren vil 2 gange autogenerere en mail til den der stillede opgaven. Altså kommer der 2 forklaringer på hvordan problemet løses. Det er jo ret forvirende. Derfor: Serveren må ikke give user2 adgang til at løse opgaven hvis user1 allerede arbejder med opgaven. På den anden side skal serveren have oplysning om at user1 lukker browser el. lign. Derfor underrettes server hvert 5 minut om at user1 stadig har siden åbnet ved at update_time.php åbnes i en skjult iframe. update_time.php's eneste opgave er at opdatere variablen 'opdater' i DB så serveren ved at user1 stadig anvender siden. Når problem.php åbnes testes det om timestamp i 'opdater' i DB er mere end 5 min. gammel. Ellers ville user2 jo blive afvist i det uendelige. open_update() skal altså automatisk indlæse update_time.php i en skjult iframe hvert 5. min. i al den tid hvor user1 har opgave.php åbent. Det må vel kræve en uendelig rutine. Det er det jeg prøver at få update_time() til at gøre. (når det løses for mig opnår jeg måske en uendelig lykke).
Jamen er det ikke det, min løsning gør med et interval? Jeg har forstået baggrunden for, hvad du vil - men har stadig intet clue om, hvad løkken skal bruges til.
Prøv at kigge på mit bud - er det ikke bare det, du vil? Blive ved med at kalde update_time hvert femte minut?
Jeg har vist fået setTimeout(); fobi. Jeg overså at du skrev setInterval() (som jeg iøvrigt ikke kendte!). Ja, du har helt ret - det gjorde hele forskellen. Men det var altså et SVAR jeg bad om.
Jeg vælger dog stadig Roenvings løsning. Det skyldes <noscript> og at jeg i anden sammenhæng anvender integreret windowsgodkendelse på domænet. Det ville medføre at en FireFox-bruger skulle logge ind hvert 5. min. når rutinen kører. Iøvrigt opdager jeg netop at den følsomme FireFox (der kræver 100% korrekt kode) at man husker at skrive window.setInterval() og window.location(true) for at fungere.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.