Eigene Timer Klasse - Meinungen?
Hi,
ich wollte euch meine selbst geschriebene Timer Klasse vorstellen. Die besonderheit daran ist, ich zähle nicht einfach immer 1s hoch, sondern schaue die tatsächliche Uhrzeit und subtrahiere die Startzeit. Damit erreicht man einen zuverlässigeren Timer über eine lange Zeit (eigentlich immer 100% genau). Mir ist zB beim Mozilla aufgefallen das die Interval Funktion nicht 100% genau ist (nicht genau 1s Abstand), ich schätze bei anderen Browsern wird es ähnlich sein. Ich gebe zu, es ist etwas groß geworden, aber schaut selbst:
Eine Testimplementierung:
Würde mich freuen wenn ihr sie mal testet. Verbersserungsvorschläge sind willkommen, die Vereinfachung oder JS-Konformität erhöht (falls vorhanden). Dabei fällt mir ein, ich berechne die Zeit selbst in der Funktion __oninterval, das hat den Grund das ich mit getHours nicht klar kam. Er hatte immer eine Stunde angezeigt, was angesichts der Millisekunden von getTime nicht sein konnte.
MfG
Hi,
ich wollte euch meine selbst geschriebene Timer Klasse vorstellen. Die besonderheit daran ist, ich zähle nicht einfach immer 1s hoch, sondern schaue die tatsächliche Uhrzeit und subtrahiere die Startzeit. Damit erreicht man einen zuverlässigeren Timer über eine lange Zeit (eigentlich immer 100% genau). Mir ist zB beim Mozilla aufgefallen das die Interval Funktion nicht 100% genau ist (nicht genau 1s Abstand), ich schätze bei anderen Browsern wird es ähnlich sein. Ich gebe zu, es ist etwas groß geworden, aber schaut selbst:
PHP:
<script type="text/javascript">
function mod(divisee,base) {
// Created 1997 by Brian Risk. http://members.aol.com/brianrisk
return Math.round(divisee - (Math.floor(divisee/base)*base));
}
function Counter()
{
var active = null;
var start = 0;
var self = this;
var secs = 0;
var mins = 0;
var hours = 0;
var oldsec = 0;
var __interval = 200; // lower interval = more precision onTimer
// start the counter
this.start = function()
{
if(!active)
{
start = this.__now();
secs = 0; // init
mins = 0;
hours = 0;
oldsec = 0;
active = window.setInterval(function() { self.__onInterval(); }, __interval);
}
};
this.stop = function()
{
this.pause();
secs = 0;
mins = 0;
hours = 0;
this.onTimer(hours,mins,secs);
};
this.pause = function()
{
if(active)
{
window.clearInterval(active);
active = null;
}
oldsec = 0;
}
this.resume = function()
{
if(!active)
{
start = this.__now() - ((((hours * 60) + mins) * 60) + secs) * 1000;
active = window.setInterval(function() { self.__onInterval(); }, __interval);
}
}
this.get_seconds = function (){ return secs; };
this.get_minutes = function (){ return mins; };
this.get_hours = function (){ return hours; };
// this function is called every second
this.onTimer = function() {};
// internal function
this.__onInterval = function()
{
var diff = this.__now() - start;
secs = Math.round(diff / 1000);
mins = Math.floor(secs / 60);
secs = mod(secs,60);
hours = Math.floor(mins / 60);
mins = mod(mins,60);
if((oldsec < secs) || (oldsec == 59))
{
this.onTimer(hours,mins,secs);
oldsec = secs;
}
};
// internal function
this.__now = function()
{
var now = new Date();
return now.getTime();
};
}
</script>
Eine Testimplementierung:
PHP:
<script type="text/javascript">
mycounter = new Counter();
mycounter.onTimer = function(hours,mins,secs){ document.getElementById('timetoshow').innerHTML = hours+':'+mins+':'+secs; };
</script>
<span id="timetoshow">0</span>
<input type="button" value="start" onClick="mycounter.start();">
<input type="button" value="pause" onClick="mycounter.pause();">
<input type="button" value="weiter" onClick="mycounter.resume();">
<input type="button" value="stop" onClick="mycounter.stop();">
Würde mich freuen wenn ihr sie mal testet. Verbersserungsvorschläge sind willkommen, die Vereinfachung oder JS-Konformität erhöht (falls vorhanden). Dabei fällt mir ein, ich berechne die Zeit selbst in der Funktion __oninterval, das hat den Grund das ich mit getHours nicht klar kam. Er hatte immer eine Stunde angezeigt, was angesichts der Millisekunden von getTime nicht sein konnte.
MfG
Zuletzt bearbeitet: