You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Aquesta eina permet fer una aproximació del temps de reacció motor d'una persona computant la diferència entre múltiples clics consecutius entre les cel·les d'una taula que van apareixent i desapareixent de forma aleatòria.
No és una eina perfectament fiable per donar una lectura acurada ja que existeixen diferents fonts de variabilitat en la mesura, com per exemple la velocitat de l'ordinador de la persona que té el client (navegador), el propi llenguatge javascript o, fins i tot, la senzilla lògica de programació emprada per evitar que surtin dues cel·les consecutives, com veurem. Tot i així, serveix com una bona aproximació per comparar individus sempre que facin servir el mateix dispositiu (sigui mòbil, tablet o ordinador).
El funcionament de l'aplicació és tal i com es mostra en el següent GIF:
2. Implementació
2.1 Fitxer scriptTaula.js
2.1.1 Funció main()
El que veu l'usuari res més carregar la pàgina és, principalment, una taula html (encara que no ho sembli). Per mostrar-la, res més carregar l'html, es crida la funció main() del fitxer scriptTaula.js. Aquesta funció amaga tots els elements <td></td> de la taula posant la propietat de CSS a style: hidden mitjançant javascript, a excepció d'un d'ells, que es deixa visible triant-lo de forma aleatòria mitjançant la funció Math.random()
Aquesta funció, igual que les demés funcions crida diverses variables globals diposades a l'inici del fitxer (així es troben disponibles mentre no es refresci la pàgina):
vararrayTempsNoRepresentatsEnHistorama=[];//s'usa en fitxer scriptHistograma
2.1.2 Funció casellaClicada()
Aquesta funció és invocada cada cop que cliquem damunt d'una de les cel·les visibles de la taula. Si la casella que s'ha clicat s'ha clicat per primer cop des de que hem carregat la pàgina, s'inicia un temporitzador amb t = performance.now() (cas en que la variable global clics val zero). En cas contrari, si la cel·la ja ha sigut premuda en anteriors ocasions (és a dir, que clics és superior a 0, exemplificat per la condició clics != 0) aleshores ja tenim una referència temporal iniciada per l'usuari i podem calcular un temps de reacció emmagatzemant el valor de t en una variable auxiliar t_previ tot fent t_previ = t i aplicant de nou la sentència t = performance.now per poder fer posteriorment la diferència t - t_previ. La funció, a més a més de computar el temps de reacció, també computa quin és el minim temps de reacció de l'usuari, el màxim, la mitjana aritmètica de tots els temps de reacció que es fan des de l'últim refresc de pantalla i passar a l'HTML les estadístiques mencionades perquè puguin ser vistes en temps real. A més a més, aquesta funció també va guardant cada temps de reacció en l'arrayTempsReaccio perquè després es pugui mostrar l'histograma quan ho demani l'usuari.
document.getElementById("estadistiques").innerHTML="<i>[min = "+Math.round(trMinim)+" ms | μ = "+Math.round(mitjana)+" ms | max = "+Math.round(trMax)+" ms]</i>";
clics+=1;
}else{//cas en que fem el primer clic, que és quan realment començem a contar el temps de reacció a l'usuari (no des de la càrrega de la pàgina)
t=performance.now();
clics+=1;
}
//amago casella antiga i mostro la nova (escollida aleatòriament, excloient L'ANTERIOR CASELLA MOSTRADA -ALEATORI SENSE REPOSICIO DE L'ULTIMA CASELLA-)
ultimNombreAleatoriGenerat=indexAleatori;
elements[indexAleatori].style.visibility="hidden";//podia posar indexCasella en comptes de indexAleatori de fet, i passar per parametre indexCasella en l'event listener de casellaClicada
Per fer l'histograma hi havia dues opcions. La primera era mirar alguna llibreria que ja l'implementés, però aquestes llibreries solen generar problemes per poder modificar l'histograma a diferents dispositius o al teu gust. La segona opció era fer des de zero l'histograma.
Per simplificar la tasca vaig demanar a xatGPT la següent prompt: "I want to generate an histogram using pure CSS, html and javascript, with no external libraries of javascript. I want it from scratch. How do i do it?". La resposta de xatGPT va ser el fitxer GPT_1.html, que permet introduir en un array el nombre de dades que volem a cada barra de l'histograma (en l'exemple de prova) mitjançant un array const data = [4, 7, 2, 5, 10];, quedant així:
A partir d'aquest fitxer vaig anar fent modificacions fins acabar obtenint el fitxer scriptHistogramaGPT.js que, sumat a l'arxiu CSS histogramaGPT.css, ens permet obtenir aquest histograma:
Dins scriptHistogramaGPT.js tenim una variable global booleana inicialitzada a fals (var histogramaGenerat = false) i tres funcions, que desgranarem a continuació en els seguents tres sub apartats (2.2.1, 2.2.2 i 2.2.3):
2.2.1 Funció generaIntervals()
Per tal de generar els límits superiors dels intervals de l'histograma (el límit inferior el calcularem dins la funció següent) donem una dada en milisegons inicial, una dada en milisegons final i un increment, que serà l'amplada de l'interval. Així podem generar un nombre d'intervals variables en funció del que ens convingui a nosaltres:
Aquesta funció el que fa és prendre l'array d'intervals i l'array de temps de reacció i retorna un array amb les dades necessaries per fer després l'histograma. Recorre un per un l'array de temps de reacció i a cada element de la mateixa l'assigna a un dels intervals de l'histograma. Noteu que per a un element el de l'array dades que retorna generaIntervals() en aquesta funció es genera un increment d'una unitat en una posició de l'array que després retorna. Aquesta última array, cada element, és el nombre d'ocurrències que hi ha per a un interval de l'histograma de tipus obert per l'esquerra i tancat per la dreta de la forma: [el - increment, el):
Aquesta funció mostra el contenidor de l'histograma i la línia horitzontal que el separa de l'àrea de joc a petició de l'usuari (quan aquest clica histograma). A més a més, carrega les dades que necessiten les dues funcions previes, les invoca i finalment genera l'histograma amb la variable data. El codi que hi ha dins del for.Each és el codi adaptat i força modificat de GPT_1.html que no només genera l'histograma sino que també posa les etiquetes d'intervals a sota i mostra un missatge d'error si l'usuari intenta generar un altre histograma sense refrescar la pàgina:
//el primer interval va de 300 a 325, segon de 325 a 350..
constiniciHistograma=340;//inici real sera "incrementHistograma" per sota del valor iniciHistograma: "[incrementHistograma - iniciHistograma"
constfinalHistograma=700;//final real es aquest, amb interval obert "finalHistograma)" o bé proper si els increments no cauen just a final histograma "finalHistograma + increment"
constincrementHistograma=30;//increments d'histograma, de valor "incrementHistograma"
vardata=afegeix_TR_a_arrayHistograma(arrIntervals,arrayTempsReaccio,incrementHistograma);// arrTR te els temps de reaccio de l'usuari, d'aspecte [324,323,322,325,699..], i es una variable global de scriptTaula.js, i ve d'allà automaticament.
document.getElementById("remanentsHistograma").innerHTML="TRs fora dels límits de representació de l'histograma: "+arrayTempsNoRepresentatsEnHistorama.length;
}else{
alert("No pots generar dos histogrames. Has de refrescar la pàgina i tornar a començar!");
}
}
About
En aquest repositori mostro una petita aplicació web per calcular el temps de reacció motor d'un usuari, clicant de forma successiva als quadrats negres. També mostra, clicant en el botó corresponent, un histograma amb les dades representades en intervals.