Petite classe de timers

Soyez le premier à donner votre avis sur cette source.

Vue 13 506 fois - Téléchargée 636 fois

Description

Petit code fait rapido ce matin suite à une source postée il y a quelques jours...

http://www.javascriptfr.com/code.aspx?ID=42289

C'est un compte à rebours on ne peut plus basique... plusieurs timer peuvent être instanciés en même temps... une fois le compte à rebours terminé un code est exécuté si ce dernier a été passé en paramètre lors de l'instanciation du timer... ce code peut être passé soit sous la forme d'une chaine à évaluer, soit sous la forme d'une référence vers une fonction ou une méthode soit sous la forme d'un url vers lequel l'internaute sera redirigé... .. .

Source / Exemple :


/*

  • timers objects reference object for global compatibilitie with the setInterval()
*
  • @var _timersObjRef
  • @access private
  • /
var _timersObjRef = { count: 0, obj: new Array }; /*
  • timer class constructor
*
  • @param mixed exec javascript evaluable code or function reference or url (for redirect) executed at the end of the timer
  • @param str target html contener id
  • @param int time start value (in seconds)
  • @param int tempo decrement offset (in seconds)
  • @param bool noAutoStart disable auto start timer
*
  • @return object
  • @access public
  • /
function timer(exec,target,time,tempo,noAutoStart) { // object attributs initialize this._id = _timersObjRef.count++; this.tempo = (tempo) ? tempo : 1; this.interval = this.tempo*1000; this.time = (time) ? time : 5; this.current = this.time; this.target = (target) ? target : null; this._handle = null; this._exec = null; if(exec) { // we search if the exec var is an url var regex = new RegExp("^((ht|f)tps?:\/\/)?(www\.)?([A-Za-z0-9-_:]+\\.[A-Za-z]{2,4})|([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+(:[0-9]+)?)", "gi"); //if it is the exec code is a redirection if (regex.exec(exec) != null) this._exec = 'location.href = "'+exec+'";'; else this._exec = exec; } //global object ref for setInterval execution _timersObjRef.obj[this._id] = this; //set the timer html contener value this._setContents(); if(!noAutoStart) this.start(); } /************************** Publics methods **************************/ /*
  • timer start method
*
  • @return void
  • @access public
  • /
timer.prototype.start = function() { //register the interval... we use the global referenced timer for updating action if(!this._handle) this._handle = setInterval("_timersObjRef.obj["+this._id+"]._update();",this.interval); } /*
  • timer stop method
*
  • @return void
  • @access public
  • /
timer.prototype.stop = function() { if(this._handle) { clearInterval(this._handle); this._handle = null; } } /*
  • timer current value reset
*
  • @return void
  • @access public
  • /
timer.prototype.rewind = function() { this.current = this.time; } /*
  • timer count restart
*
  • @return void
  • @access public
  • /
timer.prototype.restart = function() { this.stop(); this.rewind(); this.start(); } /*
  • timer time setter
*
  • @param int time start value (in seconds)
*
  • @return void
  • @access public
  • /
timer.prototype.setTime = function(time) { this.time = (time) ? time : 5; } /*
  • timer tempo setter
*
  • @param int tempo decrement offset (in seconds)
*
  • @return void
  • @access public
  • /
timer.prototype.setTempo = function(tempo) { this.tempo = (tempo) ? tempo : 1; this.interval = this.tempo*1000; } /************************** Privates methods **************************/ /*
  • timer updating
*
  • @return void
  • @access private
  • /
timer.prototype._update = function() { this.current -= this.tempo; if(this.target) this._setContents(); if(this.current == 0) { this.stop(); if(this._exec) { if(typeof this._exec == "function") this._exec(); else eval(this._exec); } } } /*
  • timer target contener updater
*
  • @return void
  • @access private
  • /
timer.prototype._setContents = function() { var _targetObj; if(document.getElementById) _targetObj = (typeof document.getElementById(this.target) == "object") ? document.getElementById(this.target) : void(0); else if(document.all) _targetObj = (typeof document.all[this.target] == "object") ? document.all[this.target] : void(0); else if(document.layers) _targetObj = (typeof document[this.target] == "object") ? document[this.target] : void(0); if(!_targetObj) return false; // html input ? if(_targetObj.type && _targetObj.type == "text") _targetObj.value = this.current; else _targetObj.innerHTML = this.current; }

Conclusion :


La classe est assez simple à utiliser... il y a un exemple assez complet dans le zip... .. .

/*
  • @param mixed exec code js à évaluer, référence vers une fonction/méthode ou url pour redirection
  • @param str target id du conteneur html
  • @param int time temps de départ en secondes (par défaut 5)
  • @param int tempo valeur de décrémentation
  • @param bool noAutoStart si true le timer ne démarrera pas automatiquement
  • /

var monTimer = new timer(exec,target,time,tempo,noAutoStart);

en outre vous disposez de quelques méthodes pour gérer le timer 4 pour le gérer et 2 setter...

- start() pour le lancer s'il n'est pas en mode auto
- stop() pour l'arrêter
- rewind() pour le remettre à sa valeur de début
- restart() on repart depuis le début

- setTime() pour modifier le temps total du timer
- setTempo() pour modifier sont rythme de décrémentation

Voili voilou... aucun bug trouvé hormis le fait, mais ce n'est pas vraiment un bug car c'est dû à javascript lui même, que le rafraichissement des timers (lorsqu'ils sont plusieurs) ne se fait pas seconde par seconde (si le tempo est à 1) mais par (1*nombre de timers) secondes... .. . ;o)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

De rien de rien de rien... .. .

Bizkottes

@ tchaOo°
PetiteNonne
Messages postés
39
Date d'inscription
mardi 5 mai 2009
Statut
Membre
Dernière intervention
20 décembre 2011

Merci pour ce show de SetTimer. je débute et ce code est comme un tuto pour moi.
Merci merci merci.
bisous.
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Salut... merci pour ton commentaire... concernant l'indentation c'est une question d'habitude... je prefere...

if(condition)
action
else
alternative

que

if(condition)
action
else
alternative

concernant les accès c'est une habitude qui vient des autres langages, notament du php, et ça n'a rien a voir avec de la frime mais juste de bien documenter ses sources pour avoir le plus d'infos en cas de remaniement ultérieur du code et pour ceux qui peuvent être amené à l'utiliser/modifier... il est toujours bon de savoir qu'une methode ou un attribut n'est pas destiné à etre utilisé/manipulé en externe... ça n'est d'ailleur pas valable que pour l'orienté objet... .. .

Sinon pour ce qui est de _timersObjRef je l'ais mis en externe car setInterval() et setTimeout() gètent très mal les référence sur l'objet courant mais je vais tester ta technique histoire de voir... il est clair que si ça marche bien ça sera plus propre... .. . ;o)

@ tchaOo°
ralecul
Messages postés
111
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
1 août 2008

Bon ben c'est gagné l'indentation marche pas... désolé...

@+
ralecul
Messages postés
111
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
1 août 2008

Salut,

Perso je pense que si j'ai besoin d'un timer j'aurais plus vite fait dans coder un,
plutôt que d'utiliser une classe aussi générique, mais bon c'est une question de gout ...

Sinon pour ce qui est du code j'ai une modif à proposer :

- Suppression de la variable globale _timersObjRef (qui est inutile)

Et quelques commentaires anecdotiques :

- je trouve ton indentation un peu zarb, la encore question de gout...

if (condition)
traitement
else
autre traitement

au lieu de :

if (condition)
traitement
else
autre traitement

(d'un autre côté je suis pas sur que l'indentation passe une fois postée et comme on peut pas éditer...)

- euh sinon le coup du @acces public / private c'est un peu de la frime, non :-)

Sans prototype (la lib) ou une autre façon de coder je vois pas trop la diff entre tes méthodes publiques et privées...

CODE sans la variable globale :

Suppression de "_timersObjRef"
Suppression de "this._id = _timersObjRef.count++;" dans le constructeur
Remplacement de la méthode start par celle-ci :

timer.prototype.start = function()
{
var localThis = this;

//register the interval... we use the global referenced timer for updating action
if(!this._handle)
this._handle = setInterval(function() {localThis._update();}, localThis.interval);
}

@+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.