24. april 2006 - 18:05Der er
37 kommentarer og 1 løsning
Tid fra start til slut
Hvordan laver jeg i javascript en alert besked hvori der står hvor lang tid der er gået i sek eller msek siden siden er loadet når man evt. trykker på en knap ?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
<span id="ur"><b id="urh">00</b><b>:</b><b id="urm">00</b><b>:</b><b id="urs">00</b></span><br> - Ret #ur{color:#000;} i style til #ur{color:#000;display:none;} for at skjule
edit [- Ret #ur{color:#000;} i style til #ur{color:#000;display:none;} for at skjule] hmm, en color definering til et skjult object er nok ikke nødvendig :P
Man kan tage et timestamp, når man kommer ind - og når man trykker istedet... kigger på den mulighed - scriptet kan også udvides med ms. dog kun ms med et ciffer som her (noget med refresh hastigheden scripts kan sættes ned til... det ser ud til at den ikke kan følge med uret hvis der er flere cifre ellers)
(edit vi tager lige den post før scriptet forfra :D)
^Man kan tage et timestamp, når man kommer ind - og når man trykker istedet...
- Det tidligere script kan også udvides med ms. dog kun med ms med et ciffer... Det har åbenbart noget med refresh hastigheden scripts kan sættes ned til at gøre... Det ser ud til at den ikke kan følge med uret hvis der er flere cifre...
... dog lige en ting afhængig af hvad du skal bruge det til... Det kører jo hos klienten og ikke serveren ... hvis jeg tager det sidste script og stiller min dato frem efter jeg er gået ind på siden - ja så har jeg f.eks. været derinde x antal timer, og minutter på få sekunder...
-- for man kan da godt hente en oplysning fra serveren, men er det vigtigt nok til at ofre både en hel del kræfter til at kode det, og så lade serveren lide for det ?-)
Der duer timestamp ikke godt nok... Hvis jeg stiller tiden tilbage, kan jeg sætte min tid ned til 1 sekund (eller minus sekunder sådan set :D) ved bare at pille ved min ur indstilling ...
^ Dertil skal siges at når man validerer på, hvad tidspunkt browseren sender ud, så kan det spoofes...
- D.v.s. du skal oprette en post i din mysql / mssql database med starttidspunkt fra din server, og så når det, der skal udføres - er udført på klientside skal browseren sende en forespørgsel retur med brugernavnet og evt. kodeord (hvis nu sessionen er udløbet) til serveren og serveren skal så tage et nyt timestamp og fratrække de to fra hinanden.
^ ... det er det mest sikre uden for stor ekstra belastning på serveren dog et par ulemper sammen med den ekstra sikkerhed:
- Ligeså snart serveren har taget(har fået besked på at tage) et timestamp begynder tiden at gå...
- Hvis personen der lige er færdig med testen på sin pc (den skal automatisk afsende en forspørgsel til serveren ved slut) har en dårlig internetforbindelse får han en dårlig tid.
- Hvis serveren er lidt belastet får han også en dårlig tid.
[ Ang. tiden kan man så hente den ved serveren istedet evt. via php ? ] - Uanset hvordan tiden hentes ned fra serveren, vil den begynde at gå ligeså snart tiden hentes - d.v.s. i teorien kan du sende tiden sammen med selve siden afhængig af selve sidens størrelse ... dog vil tiden, så gå med det samme (sådan set inden brugeren modtager siden)...
Tiden kan også hentes med xmlhttprequest, som jeg tror Roenving hentyder til - det er bedre, hvis det andet indhold fylder, samt hvis der skal være en start knap. <- Det er dog stadig ikke returtiden som browseren sender at serveren skal validere på, men et nyt timestamp, der tages fra serverens egen tid, når serveren får besked på, at "tingen" er udført/gennemført... xmlhttprequest metoden hjælper også lidt på problemet med, at tiden "går" fra starten af...
- kigger lidt på xmlhttp - timestamp - request på lokal server... men er dog lidt usikker på om det bliver godt nok...
Men sig mig ville det første script ikke løse problemet med snyd med computerens ur, da den jo tæller op live? Har testet lidt på det og kan ikke få den til at ændre sig.
Så hvis man evt. medtager ms i det script, ville det vel være perfekt...
Du nævner problemet med at den kun kan vise ms med et ciffer, kunne man ikke bare undlade at vise ms på skærmen ? For den kan vel godt regne tiden i ms ud med 3 ciffer. Dvs. således at ms først kommer frem når man aktivere alert’en?
Og I skal havde mange tak for hjælpen indtil nu, jeg afsætter lige nogle point når vi er færdige ;)
Det var optælling i ms generalt der gav mig lidt problemer... - har dog ikke testet om det blev bedre, hvis det ikke var synligt ... prøver at kigge på det så kan jeg kigge på xmlhttprequest senere...
- xmlhttprequest er mere sikker da du ikke bestemmer brugerens tid afhængig af hvad brugerens browser, siger han brugte af tid ... Dette problem gælder lige meget hvilken form for count funktion, du benytter på clientside (hos brugeren) ... alting der køres hos brugeren kan manipuleres ved - det er bl.a. derfor at selvom man har en rigtig fed javascript validering et sted, så skal den altid suppleres af en tilsvarende validering på serveren.
Derfor timestamp via xml... ved start baseret på server tid og det samme ved slut... der er dog arbejde i det som Roenving siger...
Kunne ikke lave det script i ms... browsere tillader ikke så kort timeout hastighed :/ http://www.howtocreate.co.uk/tutorials/javascript/timers ... det forklarer lidt hvorfor jeg kun kunne med et decimal: ... og så alligevel ikke med 1 decimal heller - IE siger ca. 18400 når sekund tælleren står på 20 mens FF tilsyneladende følger trop... Nåh det må blive noget xmlhttprequest...
hmm, du skal stadig selv have lavet den bagved liggende database... men her er det eksempel med xmlhttprequest der sender besked til serveren... normalt skal den ikke tage tiden med tilbage... men istedet lade timestampet stå i db'en og når man submitter anden gang tage et nyt timestamp og checke highscores m.v. på serveren og herefter sende en alert("check highscore"); eller forwarde med window.location.href="highscore.php"; istedet for den forbrugte tid ... nåh, eksemplet (slet mellemrum):
w ww.d kif.co m/users/mclemens/js/dom/tmp2/aj.php
- hvis det virker så sig til og jeg poster de 3 filer herinde :)
<?php header("Cache-Control: max-age=0");?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <meta name="robots" content="noindex, nofollow">
<script type="text/javascript" src="aj.js"> <script type="text/javascript"> ajrequsn="phpwrittenusername"; ajrequsp="phpwrittenpassword"; </script> </head> <body> <input type="button" value="Klik for at starte" onclick="ajaxgetdata('init');"> <input type="button" value="Klik for at afslutte" onclick="ajaxgetdata('end');"><br> Da jeg kun har en db på min egen pc sættes variablen midlertid her...<br>Dog anbefales det at bruge mysql start timestamp og slut timestamp istedet...<br><input type="text" id="time" disabled="disabled"> </body> </html>
/* Dont touch below unless you want to change the ajax handling */ var datafetcher; if(window.ActiveXObject){ datafetcher=new ActiveXObject("Microsoft.XMLHTTP"); }else if(window.XMLHttpRequest){ datafetcher=new XMLHttpRequest(); }
function ajaxgetdata(type,name,pass){ typen=type; datafetcher.open("GET", "userchk.php?type="+type+"&user="+name+"&pass="+pass, true); datafetcher.onreadystatechange=ajaxchkstate; datafetcher.send(null); }
function ajaxchkstate(){ if(datafetcher.readyState==4)handleajaxreq(); }
Hov den får vist ikke kodeord og brugernavn med... så skal <input type="button" value="Klik for at starte" onclick="ajaxgetdata('init');"> <input type="button" value="Klik for at afslutte" onclick="ajaxgetdata('end');"><br>
nok lige rettes til:
<input type="button" value="Klik for at starte" onclick="ajaxgetdata('init',ajrequsn,ajrequsp);"> <input type="button" value="Klik for at afslutte" onclick="ajaxgetdata('end'ajrequsn,ajrequsp);"><br>
<input type="button" value="Klik for at starte" onclick="ajaxgetdata('init',ajrequsn,ajrequsp);"> <input type="button" value="Klik for at afslutte" onclick="ajaxgetdata('end',ajrequsn,ajrequsp);"><br>
Er det en tæller du vil have samtidig? Hvis det er tilfældet kan man godt lave det, men den vil ikke være helt præcis... stadig kun sekund tælleren som før.
- Eller er det fordi den ikke skriver noget i input feltet ?
I øvrigt bør man også kunne lave det med tilfredsstillende præcision ved at benytte en tæller, der udløses med setTimeout i javascript alene, men den er ikke præcis nok til at holde tusindedele sekunder, men rigelig til at holde sekunder, hvis ikke man forventer, at adskillige tunge ting kører ved siden af på maskinen !-)
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.