2009-11-02 5 views
0

J'essaie de trouver la meilleure façon de créer un minuteur qui est associé à la saisie dans un champ de formulaire spécifié.Minuteur PHP basé sur la saisie

Chaque fois que quelqu'un commence à taper, la minuterie démarre. Lorsque la personne cesse de taper pour un arrêt de toilette, un appel téléphonique, etc., la minuterie s'arrête et reprend là où elle s'était arrêtée lorsque la personne commence à taper de nouveau. Une fois que la personne a fini de taper, elle appuie sur le bouton Soumettre et le temps est enregistré. Quelqu'un a suggéré un JS OnFocus, mais cela n'arrêtera pas la minuterie quand quelqu'un quitte son bureau pendant une minute ou deux. Quelqu'un d'autre a également suggéré une limite de temps d'attente, mais que se passe-t-il si cela expire et que la personne revient pour finir de taper.

Des suggestions sur le codage ou l'endroit où regarder serait apprécié.

  • JJ

Répondre

1

Je pense que votre titre est un peu trompeur, bien que votre message soit correctement étiqueté. Rien de tout cela (sauf si vous utilisez AJAX) sera en PHP. Votre meilleur serait probablement d'utiliser des délais d'attente avec des événements de keyup ou de keydown - redémarrez le temporisateur chaque fois que l'événement est déclenché. Si le temps est écoulé, vous arrêtez le minuteur global qui garde la trace de tout. Je ne suis pas sûr que je comprends parfaitement

Une autre personne a également proposé un temps limite, mais ce qui se passe s'il arrive à expiration et la personne retourne à la fin de leur frappe.

N'est-ce pas l'idée? Ils prendraient une sorte de pause pendant laquelle le chronomètre s'arrêterait et reprendrait quand ils reviendraient? Si tel est le cas, il sera très difficile de déterminer ce qu'est une «pause» par rapport à ce qui est «fini». Dans ce cas, vous devez définir un délai d'attente constant après lequel il est supposé qu'ils ont été effectués. Sinon, vous aurez probablement besoin d'un bouton ou d'un événement "J'ai terminé" que l'on clique ou que l'on déclenche en fonction de l'action de l'utilisateur.

Modifier en réponse à votre commentaire: Fondamentalement, vous avez quelques options. Vous aurez besoin d'au moins un appel AJAX si vous voulez stocker les données de temps sur le serveur. Cela se déclenchera lorsque le bouton "Terminé" sera cliqué. Vous aurez besoin de gestionnaires JS pour gérer les événements keydown/keyup. Ceux-ci peuvent soit déclencher des appels AJAX qui à leur tour démarrer/arrêter les timers sur le serveur écrit en PHP. Vous pouvez également avoir ces minuteurs de démarrage/arrêt sur le client implémenté dans JS. En fait, la façon dont je le vois, (ce qui est pesudocode, pas JS réel)

function keyDownHandler{ 
    resumeGlobalTimer(); 
    restartTimeOutTimer(); 
} 

function timeout(){ 
    pauseGlobalTimer(); 
} 

function resumeGlobalTimer(){ 
    if (globalTimerIsRunning) 
    //global timer wasn't paused, do nothing 
    else{ 
    someTimer.resume(); 
    globalTimerIsRunning = true; 
    } 
} 

Donc, fondamentalement, quand une touche est enfoncée, vous démarrez une minuterie qui attend de voir si une autre touche est enfoncée dans le délai et il appelle également une fonction qui reprend le minuteur global. Si une touche est enfoncée dans la limite de temps, ce temporisateur est réinitialisé à la valeur de départ et recommence à cocher. Si le délai expire, il suppose que la personne s'est éloignée et met le minuteur global en pause. La fonction de reprise vérifie que la minuterie n'est pas déjà en cours d'exécution (c'est-à-dire qu'elle n'est pas en pause), puis tente de la reprendre. À la fin de tout, un appel AJAX va télécharger la valeur globale finale à PHP.

Espérons que cela aide!

+0

Je ne dirais pas trompeur. En fait, je craie que je ne sache pas mieux en ce qui concerne PHP ou Javascript. A l'origine je l'ai tagué comme PHP mais un mod est venu et l'a changé. En ce qui concerne les temps morts ... disons que quelqu'un tape pendant une minute d'affilée puis s'éloigne suffisamment longtemps pour que le temps d'attente se produise. Quand ils reviennent et commencent à taper à nouveau, je veux que la minuterie commence là où elle s'est arrêtée. La seule fois où une minuterie est terminée est lorsque l'utilisateur clique sur "Soumettre" ou, comme vous l'avez dit, sur le bouton "J'ai terminé". Alors Chris, vous pensez que cela pourrait certainement être fait dans JS mais peut-être aussi AJAX? –

+0

Désolé, ne voulait pas paraître accusatoire :-) Il n'y a pas assez de caractères dans mon commentaire, donc je vais modifier ma réponse. –

Questions connexes