12. september 2001 - 19:05Der er
33 kommentarer og 2 løsninger
Et spørgsmål om spørgsmål - Hvordan ...
Jeg har et spørgeskema med 56 spørgsmål. Hvert spørgsmål har to svarmuligheder (radio buttons). Resultaterne af de individuelle spørgsmål skal sendes til hver sin af 8 forskellige kategorier. Efter procentvis konvertering af hver kategori skrives resultatet på skærmen.
1. Hvorfor smider den ikke resultatet tilbage ? 2. Findes der andre og bedre måder at konstrurerer koderne på - skal (helst) overholde NS & IE >4.0 ? 3. Ville det være en fordel at udfærdige spørgsmålene i JavaScript - evt. i Arrays ? 3A. Hvis Ja: hvordan skal det laves ?
Jamen du bruger jo resultatet af funktionen direkte, prøv lige at sætte koden direkte ind i, men det fungerer sikkert ikke ligeud, for så skal vi sikkert lige have lavet noget felt-navns- og selectedIndex-noget.
tony du skal kun have eet sæt <form kommandoer (\'mainform\' rundt om hele spørgeskematet) ikke rundt om hver eneste par radionknapper. De knyttes sammen af at de har samme navn.
for at adressere de enkelte knapper siger du så:
if ( document.mainForm.Sp1[0].checked ) // true hvis første knap i parret \'Sp1\' er valgt else if ( document.mainForm.Sp1[2].checked ) // true hvis anden knap i parret \'Sp1\' er valgt else ... osv.
Såvidt jeg kan se sætter du Sp1[0].checked lig med false og Sp1[1].checked lig med true. Jeg savner lidt intuitiv sammenhæng der.
Og det virker ihvertfalt ikke på den måde :(
prøv istedet:
var P1 = new Array(2, 9, 13, 16, 18, 22, 30, 44, 48, 50, 54, 56);
function CopllectP1(){ // Undersøger hvor mange i gruppen P1 er \'true\' var tael = 0; var t = document.mainForm.elements; for(i=0; i<12; i++){ if ( t[\'sp\'+p1[i]][1].checked ) tael++; } return tael; }
såvidt jeg kan se gør den præcis det samme, og du slipper for alle de individuelle variable (Sp1_2E=1, Sp1_2I=1, ...).
Eller er det meningen der senere skal komme nogle variable der har værdien 0? var Sp1_2N=0, Sp1_2J=0, ...
i så fald er det nemmeste at kode dem ind i arrayet:
var P1 = new Array(21, 90, 130, 161, 180, 221, 301, 440, 480, 500, 541, 561);
function CopllectP1(){ // Undersøger hvor mange i gruppen P1 er \'true\' var tael = 0; var t = document.mainForm.elements; for(i=0; i<12; i++){ if ( t[\'sp\'+(P1[i]/10)][P1[i]%10].checked ) tael++; } return tael; }
\"Jeg savner lidt intuitiv sammenhæng\". Ve\' du hva\' Jakob - Det gør jeg oss\'. Jeg syns\', jeg famler i mørke selv om jeg snart har slidt \"Sams\" og \"O\'Reily\" helt op og det irreterer mig grænseløst :)
ad \"... du skal kun have eet sæt <form kommandoer ...\" OK er rettet.
ad \"... for at adressere de enkelte knapper siger du så: ...\" Vil du så ha\' 56 if / else sætninger i <head> scriptet ?
ad \"var P1 = new Array(2, 9, 13, 16, 18, 22, 30, 44, 48, 50, 54, 56);\" Der \'fisker\' du i et \'brutto-array\', eller hva\' ? I så fald, vil du have alle spørgsmålene (variablerne) samlet i ét overordnet array ? Ellers så forstår jeg ikke helt, hvordan den kan vide hvad der f.eks. ligger i [2] - ved den intuitivt at \'mainform\' er et array ???
ad \"... nogle variable der har værdien 0 ?\" Nej ikke denne gang, men godt set; det havde jeg ikke skænket en tanke :(
... og skal if ( document.mainForm.Sp1[0].checked ) // true hvis første knap i parret \'Sp1\' er valgt else if ( document.mainForm.Sp1[2].checked ) // true hvis anden knap i parret \'Sp1\' er valgt
ikke være: .Sp1[1] i else delen - der er jo kun to valgmuligheder ?
ad \"P1 er præcis samme regelarray som ...\" Kære Jakob - jeg kan altså ikke få ind på \'lystavlen\' hvordan den kan vide at f.eks. Sp2_1P = 2 i \'var P1 = new Array(2, 9, ...\' ??? ... eller er det fordi du ønsker at bruge begge udgaver af \'var P1\' ???
Jeg har også gættet en del. Og nogen af de gæt er tydeligvis gale.
jeg forestiller mig et spørgeskema i stil med dem der bruges ved personligheds tests hvor fx spørgsmålene 2, 9, 13, 16, 18, ... relaterer til \"udadvendthed\" spørgsmålene 3, 7, 10, 17, 18, ... relaterer til \"creativitet\" spørgsmålene 1, 5, 11, 14, 19, ... relaterer til \"selvstændighed\" osv osv og at scriptet så skal tælle sammen hvor meget/lidt testpersonen har af diverse egenskaber. med en liste med kun spørgsmålsnumre kan testen kun sammenregne hvad der er blevet svaret ja til. ved (som i 12/09 2001 23:02:5) at sætte 0 eller 1 bagved spørgsmålmummeret kan både nej og ja komme til at tælle positivt.
Det er helt rigtigt observeret at jeg ikke ved om Sp2_1P=2, jeg konvertrede udfra at alle dine Sp?_xx variable var lig med 1.
Nej - nej ! Dine gæt er slet ikke forkerte, tværtimod. Ja det er en personlighedstest (og som du så rigtig insinuerer, er det PAEI). D.v.s. der er 8 grupper de 56 spørgsmål releterer til og scriptet skal helt rigtig tælle sammen og give en procentuel dækning tilbage inden for hver gruppe.
Min tanke var:
1. Erklær og initialiser alle spørgsmål (variabler) til 1 (mener at radio buttons ar født som \'null\'). 2. Isoler de forskellige spørgsmål i hver sin gruppe. 3. Tæl hvor mange spørgsmål, i hver gruppe, der er klikket ved. 4. Omsæt det antal til % af den enkelte gruppe. 5. Giv bruger feedback i resultatskema.
tallene i arrayene (P1, P2, ...) har betydningen: tal/10 = spørgsmålets nummer tal%10 = hvilken knap tæller op fx: tal = 20 ( 20/10 = 2 = Sp2 ) ( 20%10 = 0 = tæl op hvis første knap valgt ) tal = 21 ( 21/10 = 2 = Sp2 ) ( 20%10 = 1 = tæl op hvis anden knap valgt ) tal = 90 ( 90/10 = 9 = Sp9 ) ( 90%10 = 0 = tæl op hvis første knap valgt ) tal = 91 ( 91/10 = 9 = Sp9 ) ( 90%10 = 1 = tæl op hvis anden knap valgt ) osv. pt er alle sat til \'anden knap valgt\'. Det er utvivlsomt forkert
an dit punkt 3 \"Tæl hvor mange spørgsmål, i hver gruppe, der er klikket ved.\" Skal det være lovligt at spronge en gruppe over så der hverken er klikket det ene eller det andet?
Ja, den giver >100% - vist nok 104 i værste tilfælde. Pyt med det. En sådan test kan aldrig være andet end vejledende. I øvrigt, måske det var en god idé kun at give heltal (altså runde op / ned) i feedback\'en.
Og så et brugervenlighedsspørgsmål. Testen kommer til at foregå i et frame-miljø. Det betyder, at der vil være mulighed for, at hvert spørgsmål har sin egen fil sp1_1.html, sp1_2.html, sp2_1.html o.s.v. For mig at se giver det gode muligheder for praktisk og grafisk brugervenlighed, men det giver jo nok lidt problemer i script henseende, men måske et eksternt script vil være sagen - hvordan tror du en sådan fil / script vil se ud til ét spørgsmål ?
Hvad synes du om tanken ? ... eller vil en lang (og lidt tung) fil være bedre ?
I et frame miljø ville jeg samle data sammen i javascript variable i frameset filen, og så viderebearbejde dem til sidst. Det er ret så nemt at implementere.
du har ret i at 56 spørgsmål på een side er for mange. men 56 sideskift er også i overkanten. Hvad med 7 sider a 8 spm, eller 8 sider med 7 på hver. Så er der nogenlunde mulighed for at holde det scrollfrit.
var P1 = new Array( 21, 91, 131, 161, 181, 221, 301, 441, 481, 501, 541, 561 ); var P2 = new Array( 31, 51, 81, 111, 121, 151, 201, 231, 261, 291, 311, 341, 371, 381, 401, 471 );
Tallene 21, 91, 131 o.s.v. hvad refererer de til ? var P1 skulle gerne indeholde alle de spøgsmål der vedrører var P1 = new Array(Sp2_1P, Sp9_1P, Sp13_1P, .... så der senere kan tjekkes hvilke bruger har valgt.
P.s. jeg kan ikke så godt lægge skemaet ud nu med div. rettelser, da alle spørgsmål er implementeret og det ikke kan offentliggøres. Men hvis du har en mail adr., kan jeg sende dig et link hvor det ligger.
Ok nu forstår jeg: 21, 91, 131 ... = 2_1, 9_1, 13_1 ...
Funktionen starter en indsamling, men i hvilken variabel samles resultatet - I2.length ? Kan du godt erklære den lokalt og skal den ikke initialiseres ? Og endelig kan funktionen (komme til at) leverer heltal rundet op / ned ?
function CollectI2(){ // Undersøger hvor mange i gruppen I2 er \'true\' var tael = 0; var t = document.mainForm.elements; for(i=0; I2.length>i; i++){ if ( t[\'Sp\'+Math.round(I2[i]/10)][I2[i]%10].checked ) tael++; } return tael; }
det behøves heller ikke, tallene i arrayet p1 fortæller 2 ting. 1) hvilke spørgsmål der betyder noget. 2) hvilken radioknap der sakl være trykker for at den attribut skal tælles op.
så de 21 først i P1 betyder: spørgsmål nr 2 (Sp2) hvis han har klikket på anden radioknap i gruppen.
hvis der havde stået 20 havde det stadig været spørgsmål 2. men så vil den tælle op hvis første radioknap er valgt.
eksempel: var C1 = new Array( 31, 70 ); // måler dumdristighed. refererer til spørgsmål 3 og spørgsmål 7 Sp3 = \"Tør du slås med en løve?\" Nej 0 ja 0 hvis han svarer ja tælles dumdristig een op Sp7 = \"Er du bange for pindsvin?\" Nej 0 Ja 0 hvis han svarer nej tælles dumdristig een op.
attributten .length er defineret i ethvert array og indeholder \"antal elementer i dette array\". Ved at teste imod den istedet for et tal slipper jeg for at holde rede i hvilke arrays har 12 elementer og hvilke har 16 elementer. forløkken gennemgår bare alle de elementer der er.
der tælles op i variablen tael, ligesom før.
\"heltal rundet op\" ?. heltal kan ikke afrundes.
Ups. Fandt en fejl. de 3 sidste linier i funktionen beregnform er forkerte, jeg havde sat dem til at dividere med længden af det forkerte array. Det skal være: E2_Result = (CollectE2() * 100)/E2.length; I1_Result = (CollectI1() * 100)/I1.length; I2_Result = (CollectI2() * 100)/I2.length;
Jep, det var den fejl der gjorde jeg ikke fik 100% i alle rækker ved \'ja\' på alle spm. jeg har lagt en retter version ud på samme adresser.
OK - Så har jeg det på plads, kunne bare simpelthen ikke gennemskue det :)
Og med den sidste rettelse virker det fint nu.
Følgende resultatet vises på skærmen med f.eks.: 47,28 Det er der, det ville være dejligt, om den kunne runde op / ned til hele tal, altså f.eks.: 47 og så skrive \'%\' bagefter. (Er det ikke \'mathRound\' det hedder ?)
For bruger ville det også være godt, hvis han / hun, med et tryk på en knap, kunne udskrive sit resultat (på papir) direkte i popup\'en.
jakoba >> Desværre kan jeg ikke få \'print()\' til at virke (heller ikke den på dit link). Hvis du, eller andre, har et bud, ligger der point over i spm: http://www.eksperten.dk/spm/130226
/Tony
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.