Avatar billede dragonbook Nybegynder
24. april 2006 - 18:05 Der 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 ?
Avatar billede mclemens Nybegynder
24. april 2006 - 18:14 #1
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title>

<style type="text/css">
html,body{background:#fff;}
#ur{color:#000;}
</style>

<script type="text/javascript">

var urh, urm, urs;

window.onload=function(){
urh=document.getElementById("urh").firstChild;
urm=document.getElementById("urm").firstChild;
urs=document.getElementById("urs").firstChild;
window.setInterval("ur();",1000);
}

function ur(){
if(urs.data<9)urs.data="0"+(+urs.data+1);
else if(urs.data<59)urs.data=(+urs.data+1);
else{
  urs.data="00";
  if(urm.data<9)urm.data="0"+(+urm.data+1);
  else if(urm.data<59)urm.data=(+urm.data+1);
  else{
  urm.data="00";
  if(urh.data<9)urh.data="0"+(+urh.data+1);
  else if(urh.data<99)urh.data=(+urh.data+1);
  else urh.data="00";
  }
}
}

</script></head>

<body>
<b onclick="alert(urh.data+':'+urm.data+':'+urs.data);">Vis klokken</b><br><br><br><br>


<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

</body></html>
Avatar billede mclemens Nybegynder
24. april 2006 - 18:15 #2
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
Avatar billede dragonbook Nybegynder
24. april 2006 - 18:30 #3
Helt perfekt Takker :-)

Smid lige et svar så er der point.
Avatar billede mclemens Nybegynder
24. april 2006 - 18:32 #4
svar ;)
Avatar billede mclemens Nybegynder
24. april 2006 - 18:34 #5
og tak for point :)
Avatar billede dragonbook Nybegynder
24. april 2006 - 20:58 #6
Hov... kan man få scriptet til at medtage millisekunder ?
Avatar billede mclemens Nybegynder
24. april 2006 - 21:12 #7
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)
Avatar billede mclemens Nybegynder
24. april 2006 - 21:39 #8
måske noget i denne stil?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title>

<script type="text/javascript">

var ur;

window.onload=function(){
tmp=new Date();
ur=tmp.getTime();
}

function urchk(){
tmp=new Date();
tmp2=tmp.getTime();
tmp2=+tmp2-ur;
urh=(tmp2>3600000)?((+tmp2-tmp2%3600000)/3600000):"00";
if(urh<9&&urh!="00")urh="0"+urh;
tmp2=tmp2%3600000;
urm=(tmp2>60000)?((+tmp2-tmp2%60000)/60000):"00";
if(urm<9&&urm!="00")urm="0"+urm;
tmp2=tmp2%60000;
urs=(tmp2>1000)?((+tmp2-tmp2%1000)/1000):"00";
if(urs<9&&urs!="00")urs="0"+urs;
urms=tmp2%1000;
alert(urh+":"+urm+":"+urs+"-"+urms);
}

</script></head>

<body>
<b onclick="urchk();">Vis klokken</b><br><br><br><br>
</body></html>
Avatar billede mclemens Nybegynder
24. april 2006 - 22:05 #9
(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...
Avatar billede dragonbook Nybegynder
25. april 2006 - 16:07 #10
Okay jeg vil lige prøve med det nye timestamp script :-) Troe det virker fint.

Ang. tiden kan man så hente den ved serveren istedet evt. via php ?
Avatar billede roenving Novice
25. april 2006 - 17:18 #11
Hvad skal du bruge det til ?-)

-- 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 ?-)
Avatar billede dragonbook Nybegynder
25. april 2006 - 17:22 #12
Jeg skal bruge det til et highscore script, hvor tiden er det afgørende element.
Avatar billede mclemens Nybegynder
25. april 2006 - 19:00 #13
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...
Avatar billede dragonbook Nybegynder
25. april 2006 - 19:22 #14
Ja det er noget af en problemstilling.

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 ;)
Avatar billede mclemens Nybegynder
25. april 2006 - 19:32 #15
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...

^ Kigger derfor lige på den anden tæller først...
Avatar billede dragonbook Nybegynder
25. april 2006 - 19:34 #16
Ok det lyder bare kanont :-)
Avatar billede mclemens Nybegynder
25. april 2006 - 19:57 #17
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...

Her er den med (næsten) 1 decimal


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-1"><title>Ingen titel</title>

<style type="text/css">
html,body{background:#000;color:#fff;}
#ur{color:#fff;}
</style>

<script type="text/javascript">

var urh, urm, urs;
urms=0;

window.onload=function(){
urh=document.getElementById("urh").firstChild;
urm=document.getElementById("urm").firstChild;
urs=document.getElementById("urs").firstChild;
urms=document.getElementById("urms");
window.setInterval("ur();",1000);
window.setInterval("urmsek();",100);
}

function ur(){
if(urs.data<9)urs.data="0"+(+urs.data+1);
else if(urs.data<59)urs.data=(+urs.data+1);
else{
  urs.data="00";
  if(urm.data<9)urm.data="0"+(+urm.data+1);
  else if(urm.data<59)urm.data=(+urm.data+1);
  else{
  urm.data="00";
  if(urh.data<9)urh.data="0"+(+urh.data+1);
  else if(urh.data<99)urh.data=(+urh.data+1);
  else urh.data="00";
  }
}
}

function urmsek(){
urms=urms+1;
}

</script></head>

<body>

<span id="ur"><b id="urh">00</b><b>:</b><b id="urm">00</b><b>:</b><b id="urs">00</b></span><br><br>

<b onclick="alert(urms*100);">Vis samlet tid i ms.</b>

</body></html>
Avatar billede mclemens Nybegynder
25. april 2006 - 21:37 #18
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 :)
Avatar billede dragonbook Nybegynder
25. april 2006 - 21:43 #19
Øhhh jeg forstår ikke helt outputtet jeg får tal som 0.9600000381469727 ms hvordan skal det tolkes ?
Avatar billede mclemens Nybegynder
25. april 2006 - 21:47 #20
det er sekunder med efterfølgende ms. og nedefter... forkorter lige decimaler efter sekunder...
Avatar billede mclemens Nybegynder
25. april 2006 - 21:47 #21
*lol* , jeg har skrevet ms. det er sekunder :D
Avatar billede mclemens Nybegynder
25. april 2006 - 21:54 #22
Sådan nu skriver den tiden i ms. så kan man splitte den
ud i timer, minutter, sekunder og resterende milisekunder...
Avatar billede dragonbook Nybegynder
25. april 2006 - 21:58 #23
Ja se det ser godt ud :-) og virker helt fint så du må endelig poste de 3 filer.

Og det giver ingen problemer selv om der er mange bruger på samtidigt ?
Avatar billede mclemens Nybegynder
25. april 2006 - 22:08 #24
Det belaster serveren lidt men burde ikke være meget da vi snakker
om en meget lille txtstreng ved start og en ved slut plus samt et par headers...
Avatar billede mclemens Nybegynder
25. april 2006 - 22:09 #25
aj.php:

<?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>
Avatar billede mclemens Nybegynder
25. april 2006 - 22:10 #26
userchk.php
- du skal nok have noget db connection control m.v. ind i denne

<?php header("Cache-Control: max-age=0"); $time=array_sum(explode(" ",microtime()))*1000; echo number_format($time, 0, "", ""); ?>
Avatar billede mclemens Nybegynder
25. april 2006 - 22:11 #27
og aj.js
(xmlhttprequesteren)


/* This function handles the data recieved */
typen="";

function handleajaxreq(){
result=datafetcher.responseText;
if(typen=="init")document.getElementById("time").value=result;
else{
  alert("Forbrugt tid: "+(+result-document.getElementById("time").value)+" ms.");
  document.getElementById("time").value="";
}
}

/* 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();
}
Avatar billede mclemens Nybegynder
25. april 2006 - 22:16 #28
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>
Avatar billede mclemens Nybegynder
25. april 2006 - 22:17 #29
Der røg et komma ...

<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>
Avatar billede dragonbook Nybegynder
26. april 2006 - 20:47 #30
Ok har lige testet det men kan ikke få det til at virke.... der kommer ingen start tid eller noget når jeg trykker på start.
Avatar billede mclemens Nybegynder
26. april 2006 - 20:59 #31
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 ?
Avatar billede mclemens Nybegynder
26. april 2006 - 21:00 #32
Hvis det sidste er tilfældet så måske et link da filerne er de samme som brugt i testen...
Avatar billede dragonbook Nybegynder
26. april 2006 - 21:02 #33
Ja jeg tjekker lige om der er et link der er gået galt i byen
Avatar billede mclemens Nybegynder
26. april 2006 - 21:17 #34
... eller post dine filer / et link til test ...
Avatar billede dragonbook Nybegynder
28. april 2006 - 15:07 #35
Så nu virker det perfekt.... mange tak :-)

Jeg har oprette lidt point her http://www.eksperten.dk/spm/705936

så smid lige et svar;)
Avatar billede roenving Novice
02. maj 2006 - 00:24 #36
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 !-)
Avatar billede mclemens Nybegynder
02. maj 2006 - 00:32 #37
Noget i stil med det første indlæg???
Avatar billede mclemens Nybegynder
02. maj 2006 - 00:33 #38
[ men den er ikke præcis nok til at holde tusindedele sekunder ]
^ Jeps, og det er noget rigtig øv... ( http://www.eksperten.dk/spm/705001#rid6227811 )
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