Florians Forum » Webmaster » Ideen für Skripte und sonstige Quellcodes » Onlinezeitzähler

Hallo Florian,
ich habe hier ein Script für einen Onlinezeitzähler.
Es ist insoweit Klasse, dass er die gesamte Zeit für den Aufenthalt in einem Forum oder einer Homepage anzeigt.
Hier wird nicht gleich, wie in vielen Scripten, die Zeit beim erneuten Aufruf der Webseite neu gestartet.
Es funktioniert tadellos, wenn im Forum keine weiteren Skripte laufen (wie Spoilerbutton, Styleswitcher, Formatierbare Tooltipps, .....).
Ich habe versucht andere Variablen zu nehmen, aber das hilft nicht. Ich frage mich was hier stört?
Onlinetimer ohne "Cookies", die sich bei jedem Webseitenaufruf zurücksetzen funktionieren störungsfrei.
Stimmt hier etwas beim Cookie setzen nicht?
Hast Du eine Idee!
<html>
<head>
<script language="JavaScript">
<!--
function Zeitberechnung()
{
if(document.cookie)
{
var CookieAufrufzeit = parseInt(document.cookie);
var AktuelleZeit = new Date();
Differenz = parseInt((AktuelleZeit.getTime() - CookieAufrufzeit) / 1000);
document.Onlinezeit.OnlinezeitWert.value = Differenz;
document.cookie = CookieAufrufzeit + 1;
setTimeout("Zeitberechnung()", 1000);
}
else
{
var Aufrufzeit = new Date();
Aufrufzeit = parseInt(Aufrufzeit.getTime());
var AktuelleZeit = new Date();
document.cookie = Aufrufzeit + 1;
Differenz = parseInt((AktuelleZeit.getTime() - Aufrufzeit) / 1000);
document.Onlinezeit.OnlinezeitWert.value = Differenz;
setTimeout("Zeitberechnung()", 1000);
}
}
//-->
</script>
<title>Online-Zeit des Besuchers ermitteln</title>
</head>
</html>
<body onLoad="Zeitberechnung();">
<form name="Onlinezeit">
Sie sind seit <input name="OnlinezeitWert" size="3" type="text"> Sekunden auf dieser Webseite.
</form>
</body>
</html>
Vielen Dank im Voraus
Wolfgang

Hallo Wolfgang!
Das Problem wird wahrscheinlich sein, dass einfach nur ein Cookie gesetzt wird.
Dabei werden andere einfach gesetzte Cookies möglicherweise überschrieben.
Das Cookie müsste einen vorgegebenen Namen erhalten, damit andere nicht überschrieben werden.
Deshalb deaktiviere mal testweise nur Skripte, die etwas mit Cookies zu tun haben.
Ich versuche gleichzeitig, das Skript mehr valide zu bekommen.
Außerdem stört mich, dass das Cookie immer alle 1s neu gesetzt wird.
Es sollte auch mit einer Startzeit gehen.
Wie lange soll das Cookie eigentlich gültig sein, bis es gelöscht wird?
P.S.:
Zuerst bekam ich nur NaN (Not a Number) als Ausgabe angezeigt, auf einmal ging's dann.
Ich brauche also noch etwas Zeit, vor allem, weil diese Woche eher eng wird.

Hallo Florian,
danke für Deine Mühe!
Wenn ich Scripte mit Cookies lösche, funktioniert der Onlinetimer!
Die Gültigkeit braucht, denke ich, nur so lange bestehen zu bleiben, so lange ich in einem bestimmten Forum oder einer Homepage bin.
Bei mir erscheint auch immer "NaN".
Bis dann
Wolfgang

Hallo Wolfgang,
ich denke, dass das Skript jetzt einsatzfähig ist.
Ich weiß nun auch, warum teilweise nicht "NaN" ausgegeben wurde.
Auf meiner lokal aufgerufenen Testseite waren keine anderen Cookies gesetzt, im Gegensatz zur Online-Ansicht.
Das Skript prüfte nur, ob ein Cookie gesetzt ist. Falls ja, wurde einfach der Inhalt ausgelesen.
Probleme gibts aber, wenn im Cookie mehr als nur eine einfache Zahl steht.
z.B.: Name=Wert; - genau so liest es das Skript dann aus, was ja mehr als nur eine einfache Zahl ist.
Um nicht mit anderen Cookies (Login, Styleswitcher, etc.) zu kollidieren, muss aber ein Name gesetzt werden und davon dann dem Skript nur der Wert-Teil übergeben werden.
Das sollte nun soweit funktionieren.
Der Name des Cookies kann in in dieser Zeile angepasst werden:
var cName = 'onlineCookie';
Der Wert kann mit der Variable Differenz ausgegeben werden.
Dazu müssen einfach nur diese beiden (gleichen) Zeilen nach belieben ersetzt werden:
document.Onlinezeit.OnlinezeitWert.value = Differenz;
Im Moment erfolgt also die Ausgabe im Formular OnlineZeit im Feld OnlinezeitWert
Das Cookie ist im Moment während einer Sitzung (standard) gültig, das ist meistens bis zum Schließen des Browsers.
Um die Laufzeit zu verlängern, auch sitzungsübergreifend, kannst du noch beim Cookie-Setzen expires ergänzen.
Das funktioniert in etwa wie bei dem zweiten Beispiel bei SelfHTML.
Generiere die Variable ablauf wie bei SelfHTML im else-Block, am besten direkt vor:
document.cookie = cName+'='+(Aufrufzeit+1)+';';
und ersetze die Zeile zum Setzen des Cookies aber durch folgende:
document.cookie = cName+'='+(Aufrufzeit+1)+'; expires='+ablauf.toGMTString()+';';
Beachte auch zu allem die Kommentare, sie sollten die Arbeit ein wenig vereinfachen.
Hier nun noch das fertige Skript (Zeitberechnung() per Onload-Handler aufrufen):
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<script type="text/javascript" language="javascript">
function Zeitberechnung() {
//Cookie-Name setzen:
var cName = 'onlineCookie';
if(document.cookie && getCookie(cName) != '' && getCookie(cName) != 'NaN') {
var CookieAufrufzeit = parseInt(getCookie(cName));
var AktuelleZeit = new Date();
var Differenz = parseInt((AktuelleZeit.getTime() - CookieAufrufzeit) / 1000);
//Ausgabe in Formular-Feld:
document.Onlinezeit.OnlinezeitWert.value = Differenz;
//document.cookie = cName+'='+(CookieAufrufzeit+1)+';'; //nicht erforderlich, Sinn unbekannt
setTimeout("Zeitberechnung()", 1000);
}
else {
var Aufrufzeit = new Date();
Aufrufzeit = parseInt(Aufrufzeit.getTime());
var AktuelleZeit = new Date();
//Ablauf-Zeit (Standard: Sitzung) mit "expires" verlängern (Variable "ablauf" generieren):
document.cookie = cName+'='+(Aufrufzeit+1)+';'; //document.cookie = cName+'='+(Aufrufzeit+1)+'; expires='+ablauf.toGMTString()+';';
var Differenz = parseInt((AktuelleZeit.getTime() - Aufrufzeit) / 1000);
//Ausgabe in Formular-Feld (ohne Zeile wird erst ab 1 eingetragen):
document.Onlinezeit.OnlinezeitWert.value = Differenz;
setTimeout("Zeitberechnung()", 1000);
}
}
function getCookie(c_name) {
if (document.cookie.length>0) {
c_start=document.cookie.indexOf(c_name + '=');
if (c_start!=-1) {
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(';',c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return '';
}
</script>
Das Formular hattest du ja bereits (hier: jetzt für XHTML):
2
3
<form name="Onlinezeit" action="">
Sie sind seit <input name="OnlinezeitWert" size="3" type="text" value="" /> Sekunden auf dieser Webseite.
</form>

Hallo Florian,
es funktioniert.
Mal wieder eine super Arbeit, die Du da hinbekommen hast. Klasse!
Ich habe da noch zwei Fragen:
1. Kann man hier den "input-Befehl" durch "span" ersetzen
Sie sind seit <span name="OnlinezeitWert"></span> Sekunden auf dieser Webseite
Irgendwie funktioniert es hier nicht. Oder habe ich einen Fehler gemacht?
2. Der Cookie löscht sich erst beim Schließen des Browsers.
Ist es möglich, den Cookie bereits zu löschen, wenn ich das Forum (http://104774.homepagemodules.de) verlasse,
nicht aber die Seite im Forum wechsele
Viele Grüße und besten Dank
Wolfgang

Hallo Wolfgang,
beide Fragen sollten zumindest teilweise zu lösen sein.
1. Du hast nicht wirklich einen Fehler gemacht, allerdings kann es so nicht ganz funktionieren.
Das Ansprechen über den verwendeten Code funktioniert nur bei Formularfeldern:
document.FORMNAME.FORMFELD.value = Wert;
Du vergibst dem Span am besten eine ID und sprichst es darüber an und änderst den Inhalt z.B. mit innerHTML / innerText.
Das im Beispiel verwendete document.all solltest du jedoch nicht verwenden, benutze stattdessen das neuere document.getElementById()
=> Beispiel.:
document.getElementById('SpanID').innerHTML = 'HTML-Code'+Differenz+'weiterer Code';
Verwende innerHTML eben dann, wenn auch Formatierungen etc. als HTML-Code eingesetzt werden, ansonsten sollte innerText reichen, wenn eben z.B. nur die Zahl eingesetzt werden soll:
document.getElementById('SpanID').innerText = Differenz;
Die Formatierung wäre dann auch über Stylesheets für dieses Span möglich. (fast besser, aber Geschmackssache)
Beachte, dass dabei zwei Zeilen ausgetauscht werden müssen. (s. zweite Code-Erläuterung in meinem letzten Beitrag)
2. Dazu müsste ein Event beim Schließen des Browsers ausgelöst werden.
Dieses muss dann das Ablaufdatum des Cookies in die Vergangenheit setzen, um es zu löschen.
Setze dazu folgende Codezeile an den Anfang innerhalb der Funktion Zeitberechnung():
window.onunload = function() { document.cookie = cName+'='+(Aufrufzeit+1)+'; expires=Thu, 01-Jan-70 00:00:01 GMT;'; }
Das Problem ist nur, dass das Skript nicht nur beim Tab/Fenster-Schließen aufgerufen wird, sondern auch beim Seitenwechsel innerhalb.
Es gibt einige Workarounds, die aber meistens sehr dürftig sind.
Unter anderem gibt es hier zwar einen einigermaßen guten: http://forum.de.selfhtml.org/archiv/2002/7/t16948/
...aber es wäre denke ich wenig sinnvoll, alle links mit onclick versehen zu müssen.
P.S.: Ich habe die Skripte jetzt nicht mehr getestet, so sollten sie aber trotzdem funktionieren.
Ich hoffe nur, dass sich keine Fehler in der Groß- und Kleinschreibung eingeschlichen haben...

Hallo Florian,
mit der "SpanID" hat super funktioniert. Sie jetzt auch besser aus!
Zu 2.:
Kann es sein, dass hier noch ein Fehler vorliegt ?
window.onunload = function() { document.cookie = cName+'='+(Aufrufzeit+1)+'; expires=Thu, 01-Jan-70 00:00:01 GMT;'; }
Der Zähler startet bei jedem Seitenaufruf neu.
Hast Du hier noch eine Idee?
Gruß
Wolfgang

Hallo Wolfgang,
ist ja schonmal prima, dass es mit Span funktioniert hat.
Zu 2. müsste man am besten einen Workaround finden, welcher das Event nur beim Verlassen des Servers/Schließen des Tabs abfeuert.
Aber wie gesagt, ist die Lösung allen Links ein Onclick hinzuzufügen, nicht das wahre.

Hallo Florian,
ich habe mich etwas zu früh gefreut!
Der Onlinezähler läuft bei mir nicht im FF, und NS.
So weit ich weiß, nutzt Du doch den FF. Dann müste der Zähler doch funktionieren?
Oder habe ich etwas bei der "SPAN-Zeile" vergessen?
Nachtrag: Kann man den Onlinezähler auch in einem Frame zum Laufen bringen?
<html>
<head>
<script type="text/javascript" language="javascript">
function Zeitberechnung() {
//Cookie-Name setzen:
var cName = 'onlineCookie';
if(document.cookie && getCookie(cName) != '' && getCookie(cName) != 'NaN') {
var CookieAufrufzeit = parseInt(getCookie(cName));
var AktuelleZeit = new Date();
var Differenz = parseInt((AktuelleZeit.getTime() - CookieAufrufzeit) / 1000);
//Ausgabe in Formular-Feld:
document.getElementById('Onlinezeit').innerText = Differenz;
//document.cookie = cName+'='+(CookieAufrufzeit+1)+';'; //nicht erforderlich, Sinn unbekannt
setTimeout("Zeitberechnung()", 1000);
}
else {
var Aufrufzeit = new Date();
Aufrufzeit = parseInt(Aufrufzeit.getTime());
var AktuelleZeit = new Date();
//Ablauf-Zeit (Standard: Sitzung) mit "expires" verlängern (Variable "ablauf" generieren):
document.cookie = cName+'='+(Aufrufzeit+1)+';'; //document.cookie = cName+'='+(Aufrufzeit+1)+'; expires='+ablauf.toGMTString()+';';
var Differenz = parseInt((AktuelleZeit.getTime() - Aufrufzeit) / 1000);
//Ausgabe in Formular-Feld (ohne Zeile wird erst ab 1 eingetragen):
document.getElementById('Onlinezeit').innerText = Differenz;
setTimeout("Zeitberechnung()", 1000);
}
}
function getCookie(c_name) {
if (document.cookie.length>0) {
c_start=document.cookie.indexOf(c_name + '=');
if (c_start!=-1) {
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(';',c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return '';
}
</script>
<title>Online-Zeit des Besuchers ermitteln</title>
</head>
</html>
<body id="forum" marginheight="0" marginwidth="0" leftmargin="0" rightmargin="0" topmargin="0" bottommargin="0" onload="Zeitberechnung();">
<b>Sie sind seit <span id="Onlinezeit"> </span> Sekunden auf dieser Webseite</b>
</body>
</html>
Gruß
Wolfgang

Hallo Florian,
ich habe die Ursache gefunden (Rot gekennzeichnet).
Jetzt läuft der Onlinezähler im FF, IE, Opera, NS und Safari.
Er läuft sogar auch im "Frame", mit einer Ausnahme.
Der Internet Explorer.
Er tut es einfach nicht.
In der Anzeige erscheint eine "Null".
Es sieht so aus, als wenn der Zähler angelaufen und dann stehengeblieben ist.
Gibt es hier noch eine einfache Lösung?
<html>
<head>
<script type="text/javascript" language="javascript">
function Zeitberechnung() {
//Cookie-Name setzen:
var cName = 'onlineCookie';
if(document.cookie && getCookie(cName) != '' && getCookie(cName) != 'NaN') {
var CookieAufrufzeit = parseInt(getCookie(cName));
var AktuelleZeit = new Date();
var Differenz = parseInt((AktuelleZeit.getTime() - CookieAufrufzeit) / 1000);
//Ausgabe in Formular-Feld:
document.getElementById("Onlinezeit").innerHTML = Differenz;
//document.cookie = cName+'='+(CookieAufrufzeit+1)+';'; //nicht erforderlich, Sinn unbekannt
setTimeout("Zeitberechnung()", 1000);
}
else {
var Aufrufzeit = new Date();
Aufrufzeit = parseInt(Aufrufzeit.getTime());
var AktuelleZeit = new Date();
//Ablauf-Zeit (Standard: Sitzung) mit "expires" verlängern (Variable "ablauf" generieren):
document.cookie = cName+'='+(Aufrufzeit+1)+';'; //document.cookie = cName+'='+(Aufrufzeit+1)+'; expires='+ablauf.toGMTString()+';';
var Differenz = parseInt((AktuelleZeit.getTime() - Aufrufzeit) / 1000);
//Ausgabe in Formular-Feld (ohne Zeile wird erst ab 1 eingetragen):
document.getElementById("Onlinezeit").innerHTML = Differenz;
setTimeout("Zeitberechnung()", 1000);
}
}
function getCookie(c_name) {
if (document.cookie.length>0) {
c_start=document.cookie.indexOf(c_name + '=');
if (c_start!=-1) {
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(';',c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return '';
}
</script>
<title>Online-Zeit des Besuchers ermitteln</title>
</head>
</html>
<body id="forum" marginheight="0" marginwidth="0" leftmargin="0" rightmargin="0" topmargin="0" bottommargin="0" onload="Zeitberechnung();">
<b>Sie sind seit <span id="Onlinezeit"> </span> Sekunden auf dieser Webseite</b>
</body>
</html>
Gruß
Wolfgang

Hallo Wolfgang,
vielleicht hat dein IE ja Probleme mit getElementById.
Im Gegensatz zu vielen anderen Browsern kann der IE immer noch mit document.all umgehen.
Ich habe mal das Skript so verändert, dass document.all verwendet wird, falls es der Browser unterstützt.
Das Skript lief so bei mir im Firefox, IE und Opera:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Test</title>
<script type="text/javascript" language="javascript">
function Zeitberechnung() {
//Cookie-Name setzen:
var cName = 'onlineCookie';
if(document.cookie && getCookie(cName) != '' && getCookie(cName) != 'NaN') {
var CookieAufrufzeit = parseInt(getCookie(cName));
var AktuelleZeit = new Date();
var Differenz = parseInt((AktuelleZeit.getTime() - CookieAufrufzeit) / 1000);
//Ausgabe in Formular-Feld:
//document.Onlinezeit.OnlinezeitWert.value = Differenz;
//document.getElementById('OnlinezeitWert').innerHTML = '<i>'+Differenz+'</i>';
(!document.all) ? document.getElementById('OnlinezeitWert').innerHTML = '<i>'+Differenz+'</i>' : document.all.OnlinezeitWert.innerHTML = '<i>'+Differenz+'</i>';
//document.cookie = cName+'='+(CookieAufrufzeit+1)+';'; //nicht erforderlich, Sinn unbekannt
setTimeout("Zeitberechnung()", 1000);
}
else {
var Aufrufzeit = new Date();
Aufrufzeit = parseInt(Aufrufzeit.getTime());
var AktuelleZeit = new Date();
//Ablauf-Zeit (Standard: Sitzung) mit "expires" verlängern (Variable "ablauf" generieren):
document.cookie = cName+'='+(Aufrufzeit+1)+';'; //document.cookie = cName+'='+(Aufrufzeit+1)+'; expires='+ablauf.toGMTString()+';';
var Differenz = parseInt((AktuelleZeit.getTime() - Aufrufzeit) / 1000);
//Ausgabe in Formular-Feld (ohne Zeile wird erst ab 1 eingetragen):
//document.Onlinezeit.OnlinezeitWert.value = Differenz;
(!document.all) ? document.getElementById('OnlinezeitWert').innerHTML = '<i>'+Differenz+'</i>' : document.all.OnlinezeitWert.innerHTML = '<i>'+Differenz+'</i>';
setTimeout("Zeitberechnung()", 1000);
}
}
function getCookie(c_name) {
if (document.cookie.length>0) {
c_start=document.cookie.indexOf(c_name + '=');
if (c_start!=-1) {
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(';',c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return '';
}
</script>
</head>
<body onload="Zeitberechnung();">
<form name="Onlinezeit" action="">
Sie sind seit <span id="OnlinezeitWert" style="font-weight:bold;"></span> Sekunden auf dieser Webseite.
</form>
</body>
</html>

Hallo Florian,
das Script funktioniert genau so gut.
Ich denke, dass der Google-Übersetzer hier Fehler mit hinein bringt!
Ich habe den "Google-Translater" wieder aus meinem Forum herausgenommen. Er arbeiten bei einfachen Texten sehr gut. Sobalt komplexe Formatierungen und Scripte mit eingebunden sind, ist er nicht zu gebrauchen. Selbst beim Kopieren werden dann falsche Daten übernommen.
Auf jeden Fall arbeitet der Onlinezeitzähler soweit in allen Browsern!
Nochmals besten Dank und viele Grüße aus Hannover
Wolfgang

Hallo Wolfgang,
wenn das Skript nun so funktioniert, dann ist ja alles bestens.
Ich habe das Forum nochmal durch den Translator gejagt.
Dabei hat sich bestätigt, was ich mir schon gedacht habe.
Wenn man über eine URL fährt, steht ja in der Statusleiste die verlinkte Adresse.
Diese Adresse ist immer eine von Google, die Foren-Urls werden nur als Parameter mitgegeben.
Und das ganze System des Forums funktioniert eben leider (zum Glück) nicht eingebettet innerhalb anderer Seiten, vor allem der Login etc. ...
Zumindest muss ich z.B. des Öfteren auf die korrekten Pfadangaben achten, wenn ich eine Seite in eine andere "include".
Ich will es jedoch nicht zu 100% ausschließen, dass es keine Möglichkeit gibt, den Translator einzubinden.
Vor allem, nachdem ich den Translator mal in einem Testforum eines Supporters gesehen habe.
Wäre aber möglich, dass dieser auch nicht mit allen Funktionen klarkommt.
Vielleicht hilft eine direkte Nachfrage im Support doch noch weiter.
Falls dann doch alles mit dem Translator funktionieren würde, würde mich das auch interessieren. (ob und wie das möglich sein kann)

Hallo Florian,
läßt sich die Onlinezeit auch in Std., Min., Sek. anzeigen (z.B.: 1:55:21)
Bis dann und Danke im Voraus
Wolfgang

Hallo Wolfgang,
die Antwort auf deine Frage ist, ja das geht!
Ich habe das Skript nochmals weitestgehend überarbeitet und stark gekürzt.
Außerdem habe ich die Funktion getCookie etwas umbenannt, um evtl. Probleme mit anderen getCookie-Funktionen in anderen Skripts zu vermeiden.
Nachfolgend der komplette Quellcode, der aber nochmals in der Datei im Anhang zu finden ist.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Onlinezeit</title>
<script type="text/javascript" language="javascript">
/*<![CDATA[*/
function Zeitberechnung() {
if (document.getElementById('OnlinezeitWert')) {
//Cookie-Name setzen:
var cName = 'onlineCookie';
if (document.cookie && getTimeCookie(cName) != '' && getTimeCookie(cName) != 'NaN') {
var CookieAufrufzeit = parseInt(getTimeCookie(cName));
}
else {
var Aufrufzeit = parseInt((new Date()).getTime());
//Ablauf-Zeit (Standard: Sitzung) mit "expires" verlängern (zuvor Variable "ablauf" generieren):
document.cookie = cName+'='+(Aufrufzeit)+';'; //document.cookie = cName+'='+(Aufrufzeit)+'; expires='+ablauf.toGMTString()+';';
var CookieAufrufzeit = Aufrufzeit;
}
var Differenz = parseInt(((new Date()).getTime() - CookieAufrufzeit) / 1000); //Sekunden gesamt
var Sekunden = (Differenz%60); //Sekunden seit voller Minute
var Minuten = Math.floor(Differenz/60); //Minuten gesamt
var Stunden = Math.floor(Minuten/60); //Stunden gesamt
//Zeitstring aufbauen:
var stime = '<i>'+mknull(Differenz,2)+'<\/i> Sekunden'; //Zeitstring in Sekunden
if (Minuten >= 1) {
stime = '<i>'+mknull(Minuten,2)+':'+mknull(Sekunden,2)+'<\/i> Minuten'; //Zeitstring in Minuten
if (Stunden >= 1) {
Minuten = Minuten%60; //Minuten seit voller Stunde
stime = '<i>'+mknull(Stunden,2)+':'+mknull(Minuten,2)+':'+mknull(Sekunden,2)+'<\/i> Stunden'; //Zeitstring in Stunden
}
}
//Ausgabe in Formular-Feld: //document.Onlinezeit.OnlinezeitWert.value = Differenz;
(!document.all) ? document.getElementById('OnlinezeitWert').innerHTML = stime : document.all.OnlinezeitWert.innerHTML = stime;
setTimeout("Zeitberechnung()", 1000);
}
}
function getTimeCookie(c_name) {
if (document.cookie.length>0) {
c_start=document.cookie.indexOf(c_name + '=');
if (c_start!=-1) {
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(';',c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return '';
}
function mknull(zahl, stellen) {
var strlen = zahl.toString().length;
for(var i=strlen; i<stellen; i++){
zahl = '0'+zahl;
}
return zahl;
}
/*]]>*/
</script>
</head>
<body onload="Zeitberechnung();">
<span id="Onlinezeit">
Ihr erster Aufruf war vor <span id="OnlinezeitWert" style="font-weight:bold;"></span>.
</span>
</body>
</html>
Die Ausgabe kannst du bei Bedarf noch leicht modifizieren, indem du die Strings (stime) nach dem Kommentar //Zeitstring aufbauen: abänderst.
Die Funktion mknull(ZAHL,2) sorgt dafür, dass Sekunden, Minuten und Stunden immer mindestens zweistellig angezeigt werden.
Wenn die Stunden z.B. auch einstellig angezeigt werden dürfen, musst du nur an entsprechender Stelle die 2 zur 1 ändern (3 für bis zu 2 führende Nullen...).
Aber denke daran, wenn du die Ausgabe der Sekunden modifizierst, musst du dass in allen drei Definitionen für stime durchführen, da die Sekunden-Anzeige im Falle von Minuten oder auch Stunden jeweils überschrieben wird.
Die Minuten musst du hingegen nur zweimal und Stunden nur einmal verändern.
Der Beschreibungs-Text um die eigentliche Zeit-Anzeige (welche jetzt eben statt einer einfachen Zahl etwas formatiert wurde) steht nach wie vor außerhalb des SPANs.

Hallo Florian,
das Script ist absolut Spitze! Danke dafür!
Das alte Script konnte ich in meinem Forum nicht belassen. Es hat den 3-D Spoiler und die Scroll-Funktion beeinflusst. Mit dem neuen Script funktioniert wieder alles.
Ich habe den Online-Zeitzähler in die Forum-Statistik untergebracht.
Bis dann
Wolfgang

Hallo Wolfgang,
mir ist gerade noch etwas aufgefallen, als ich geprüft habe, ob in deinem Forum noch Errors auftreten.
Eigentlich war es wegen der Willkommen-Box, aber der Error entsteht, wenn die Onlinezeit-Anzeige nicht auf der Seite vorhanden ist.
Beispiele sind Beitragsübersicht und -Anzeige.
Das Skript wird nun nach einer minimalen Änderung nicht mehr permanent wiederholt, sondern abgebrochen, falls die Anzeige auf der entsprechenden Seite nicht eingebaut wurde.
Damit ist dann auch der Error behoben.
In der Funktion Zeitberechnung() muss nur der Quellcode von einer Bedingung umgeben werden.
2
3
if (document.getElementById('OnlinezeitWert')) {
...
}
Damit wird sichergestellt, dass das Skript nur ausgeführt wird, wenn ein SPAN mit der ID OnlinezeitWert auch wirklich existiert.
Die Änderungen habe ich bereits in meinem vorigen Beitrag eingefügt und auch die Datei im Anhang aktualisiert.
Dein Forum sollte dann wohl auch wieder ohne jeglichen Fehler funktionieren.

Im Anschluss gleich noch die erweiterte Version, bei welcher 1 Sekunde/Minute/Stunde berücksichtigt wird.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Onlinezeit</title>
<script type="text/javascript" language="javascript">
/*<![CDATA[*/
function Zeitberechnung() {
if (document.getElementById('OnlinezeitWert')) {
//Cookie-Name setzen:
var cName = 'onlineCookie';
if (document.cookie && getTimeCookie(cName) != '' && getTimeCookie(cName) != 'NaN') {
var CookieAufrufzeit = parseInt(getTimeCookie(cName));
}
else {
var Aufrufzeit = parseInt((new Date()).getTime());
//Ablauf-Zeit (Standard: Sitzung) mit "expires" verlängern (zuvor Variable "ablauf" generieren):
document.cookie = cName+'='+(Aufrufzeit)+';'; //document.cookie = cName+'='+(Aufrufzeit)+'; expires='+ablauf.toGMTString()+';';
var CookieAufrufzeit = Aufrufzeit;
}
var Differenz = parseInt(((new Date()).getTime() - CookieAufrufzeit) / 1000); //Sekunden gesamt
var Sekunden = (Differenz%60); //Sekunden seit voller Minute
var Minuten = Math.floor(Differenz/60); //Minuten gesamt
var Stunden = Math.floor(Minuten/60); //Stunden gesamt
//Zeitstring aufbauen:
var stime = '<i>'+mknull(Differenz,2)+'<\/i> '+ ((Differenz!=1)? 'Sekunden':'Sekunde'); //Zeitstring in Sekunden
if (Minuten >= 1) {
stime = '<i>'+mknull(Minuten,2)+':'+mknull(Sekunden,2)+'<\/i> '+ ((Minuten!=1)? 'Minuten':'Minute'); //Zeitstring in Minuten
if (Stunden >= 1) {
Minuten = (Minuten%60); //Minuten seit voller Stunde
stime = '<i>'+mknull(Stunden,2)+':'+mknull(Minuten,2)+':'+mknull(Sekunden,2)+'<\/i> '+ ((Stunden!=1)? 'Stunden':'Stunde'); //Zeitstring in Stunden
}
}
//Ausgabe in Formular-Feld: //document.Onlinezeit.OnlinezeitWert.value = Differenz;
(!document.all) ? document.getElementById('OnlinezeitWert').innerHTML = stime : document.all.OnlinezeitWert.innerHTML = stime;
setTimeout("Zeitberechnung()", 1000);
}
}
function getTimeCookie(c_name) {
if (document.cookie.length>0) {
c_start=document.cookie.indexOf(c_name + '=');
if (c_start!=-1) {
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(';',c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return '';
}
function mknull(zahl, stellen) {
var strlen = zahl.toString().length;
for(var i=strlen; i<stellen; i++){
zahl = '0'+zahl;
}
return zahl;
}
/*]]>*/
</script>
</head>
<body onload="Zeitberechnung();">
<span id="Onlinezeit">
Ihr erster Aufruf war vor <span id="OnlinezeitWert" style="font-weight:bold;"></span>.
</span>
</body>
</html>
Das Komplett-Beispiel befindet sich auch nochmals in der Datei im Anhang.