Avatar billede heyn Nybegynder
09. februar 2006 - 09:43 Der 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();

Hvad er fejlen?

Mvh Christian
Avatar billede barklund Nybegynder
09. februar 2006 - 10:37 #1
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.

:)

--
Morten Barklund
Avatar billede heyn Nybegynder
09. februar 2006 - 10:56 #2
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.

Mvh Christian
Avatar billede heyn Nybegynder
09. februar 2006 - 11:09 #3
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.
Avatar billede barklund Nybegynder
09. februar 2006 - 11:32 #4
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... :)

--
Morten Barklund
Avatar billede softspot Forsker
09. februar 2006 - 12:15 #5
Hvis du vil oprette en reference til en eventhandler, skal du undlade paranteserne i dit kald, sådan:

document.onload = update_time;

og IKKE som du gør nu (da du så kalder funktionen i stedet for at sætte en reference til den som bliver kørt når siden loader):

document.onload = update_time();
Avatar billede roenving Novice
09. februar 2006 - 12:17 #6
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]
Avatar billede heyn Nybegynder
09. februar 2006 - 14:07 #7
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.

Mvh Christian
Avatar billede roenving Novice
09. februar 2006 - 14:12 #8
-- .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 ...
Avatar billede softspot Forsker
09. februar 2006 - 14:23 #9
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:

document.onload = update_page();
Avatar billede heyn Nybegynder
09. februar 2006 - 16:06 #10
->>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; }}
Avatar billede heyn Nybegynder
09. februar 2006 - 16:10 #11
Jeg kom til at klikke på send før tid:

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?

Mvh Christian
Avatar billede heyn Nybegynder
09. februar 2006 - 16:41 #12
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
Avatar billede roenving Novice
09. februar 2006 - 17:09 #13
Ja, i et åbent spørgsmål (hvor et svar ikke er blevet accepteret !-) kan man oppe til venstre under Funktioner finde "Afsæt flere point" ...
Avatar billede roenving Novice
09. februar 2006 - 17:23 #14
Jeg angiver script-tingen, fordi den kan afvikles uden det klik, der ellers kommer i IE, når den requester en url !-)

-- og til 16:10:06

-- det er nok fordi en timeout-tråd udstyres med et id, som du samler op med variablen u, den tråd skal dræbes for ellers fortsætter den !-)

-- den skal derfor sættes udenfor funktionen, og testes, når funktionen kaldes:

var u;
function time_out(){
    if(u)
      clearTimeout(u);
    u = setTimeout("open_update()",time_tid);
    return true;
}
Avatar billede barklund Nybegynder
10. februar 2006 - 09:35 #15
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);

Eller har jeg misforstået pointen i den løkke?

--
Morten Barklund
Avatar billede heyn Nybegynder
10. februar 2006 - 11:20 #16
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).

Og husk at det var SVAR jeg bad om?

Mvh Christian
Avatar billede softspot Forsker
10. februar 2006 - 11:25 #17
OK, hvis du ligefrem insisterer (selvom jeg ikke deltog helt så meget som de to andre)...  :)
Avatar billede barklund Nybegynder
10. februar 2006 - 11:40 #18
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?

--
Morten Barklund
Avatar billede heyn Nybegynder
10. februar 2006 - 12:56 #19
->> Barklund

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.

Mvh og tak Christian
Avatar billede barklund Nybegynder
10. februar 2006 - 13:11 #20
Du får et svar - og jeg håber, at vi har forstået hinanden :)
Avatar billede heyn Nybegynder
10. februar 2006 - 13:26 #21
Begynderen Christian har forstået' lært en hel del og har nået den evige evige lykke.
Mvh Christian
(Så mangler vi bare et SVAR fra Roenving)
Avatar billede roenving Novice
10. februar 2006 - 13:34 #22
Velbekomme '-)
Avatar billede heyn Nybegynder
10. februar 2006 - 13:39 #23
God weekend til jer alle 3 - Christian
Avatar billede softspot Forsker
10. februar 2006 - 13:52 #24
Tak i lige måde og tak for point :)
Avatar billede barklund Nybegynder
10. februar 2006 - 14:19 #25
Tark for points :)
Avatar billede roenving Novice
10. februar 2006 - 14:45 #26
-- og også jeg siger tak for point ;~}
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester