29. december 2009 - 11:22Der er
37 kommentarer og 1 løsning
En langhåret beregner
Jeg er lige ved at udarbejde en langhåret beregner, tager den i steps og har allerede ved step1 mødt muren.
- Step1 - User knaster tal ind i form User input (A): ___ User input (B): ___ User input (C): ___ Total A*B*C (resultat1): ____
OBS: 1) Alle indtastede tal skal blive stående. 2) Total skal gange a, b og c-tal sammen 3) Spørgsmål: kan man lave det uden button v. total og uden at den calc´er løbende? Eller er det usmart?
Jeg har prøvet at definere variablerne, og jeg også prøvet en direkte parsefloat i html'en uden succes. Nu har jeg skrottet det hele.
- Step2 - Kommer! Men den handler i store træk om, at tage fx B-tallet og gange det med et nyt userInput-tal.
Jeg forstår ikke hvad du mener med button v. total? Altså vil du lave det uden en knap til sidst og uden at den udregner løbende? Hvornår skal den så vide hvornår det skal udregnes?
Her er et eksempel ud fra det du skrev: <script> function beregn() { var error = 0; a = parseFloat(document.getElementById("input_a").value); if (isNaN(a)) { error = 1; alert("A er ikke et tal!"); }
b = parseFloat(document.getElementById("input_b").value); if (isNaN(b)) { error = 1; alert("B er ikke et tal!"); }
c = parseFloat(document.getElementById("input_c").value); if (isNaN(c)) { error = 1; alert("C er ikke et tal!"); }
if (error == 0) { var total = a*b*c; document.getElementById("total").innerHTML = total; } } </script>
>>Hvornår skal den så vide hvornår det skal udregnes? Jeg tænkte på ved indtastning af sidste tal. Hvis man fx laver en hidden løbende calc, der så først ved indtastning af tal E, viser forgående Total, kunne det måske lade sig gøre, men så bliver scriptet også for langhåret for sådan en som mig. Problemet er, at folk ikke får så vældig meget ud af den mellemregning, den skal dog alligevel vises på skærmen (og med button kræver det at folk trykker hver gang der skal laves en mellemregning - det bliver også noget skidt). Det er helheden med alle tal, der til sidst giver mening.
Ja, det kan det godt. Du får så nogle andre udfordringer, f.eks. hvis man vil indtaste 100 vil den så beregne ved både 1, 10 og 100. Det kan dog håndteres med en settimeout, der venter lidt tid inden beregningen, så man kan skrive mere inden den gør noget.
Jeg har lavet eksemplet lidt om, så den har det hele. Og skrevet kommentarer så du kan finde rundt i det:
<script> function beregn() { var errors = [];
// hent felterne og tjek for fejl a = document.getElementById("input_a").value; if (isNaN(a)) { errors.push("A er ikke et tal!<br />"); // fejl meddelelse } else { a = parseFloat(a); }
b = document.getElementById("input_b").value; if (isNaN(b)) { errors.push("B er ikke et tal!<br />"); } else { b = parseFloat(b); }
c = document.getElementById("input_c").value; if (isNaN(c)) { errors.push("C er ikke et tal!<br />"); } else { c = parseFloat(c); }
if (errors.length == 0) { // ingen fejl var total = a*b*c; // beregn total document.getElementById("total").innerHTML = total; // vis total document.getElementById("errors").innerHTML = ""; // fjern eventuelle fejl meddelelser
} else { // fejl, vis meddelelser error = ""; for (var i=0; i<errors.length; i++) { // hent alle fejl fra array error += errors[i]; } document.getElementById("errors").innerHTML = error; // vis fejl } }
var t; // variabel til at gemme timeout eventen function pre_beregn() { input_fields = document.getElementsByName("input_felt"); empty = 0;
for (var i=0; i<input_fields.length; i++) { // er alle felter udfyldt? if (input_fields[i].value == "") empty = 1; } if (empty == 0) { // alle felter er udfyldt t = setTimeout("beregn()",500); // kør beregning } }
Som det er lavet nu, tjekker den om alle felter med name="input_felt" er udfyldt, inden den laver beregningen. Det kan laves mere fleksibelt hvis skal benytte forskellige grupper af navne.
Tak for den om plugin, det vil jeg klart benytte mig af. Jeg har indsat scriptet i mit, men der kommer ikke noget resultat ud. Jeg kører lige det der firebug-plugin...
Så nu virker det, havde glemt at definere <script> - joy makes blind ;-). Skal lige ligge en times tid, snotforkølet, så vil jeg vende tilbage. Skal se om jeg umiddelbart selv kan gå videre med step2. Vender stærkt tilbage :-)
Denne her forkølelse har godt nok fået krammet på mig - der er dømt nytårsaften under dynerne - hvor sygt, i ordets virkelig forstand! ;-) Jeg vender tilbage til denne tråd i det nye år, men ind til da, vil jeg sige tusind tak for din formidable hjælp, intenz og ønske dig et godt nytår. :-)
Så er jeg endelig kommet oven på, det var en hård "nyser" ;-)
- Step 2 -
TOTALB Jeg har defineret en ny var total - "var totalb = a*b*c;" og en ny document.getElementById med totalb. Og span id med totalb. Det funker også sublimt, og gør hvad den skal.
TOTALC Men så har jeg prøvet, at definere en ny "hent felterne og tjek for fejl" med totalb, og så kommer problemet, for den skal ku' tage totalb og dividere dette tal med c, dvs totalb/c og vise resultatet. Er der nogen fiks måde at gøre dette på?
Det var da godt :) Jeg har også selv været syg de sidste 4-5 dage og er ved at være ovenpå igen.
Jeg forstår ikke helt problemet med TOTALC? Skal udregningen ikke bare ske med de samme 3 input felter eller skal du bruge flere felter til din nye "hent felterne og tjek for fejl"?
Jeg skal have defineret en to-digit efter punktum. Øhm og vil gerne indsætte "document.write( 1.12.toFixed(2);" Spørgsmål: skal jeg egentlig ikke også definere "document.write( 1.1.toFixed(2);" og "document.write( 1.123.toFixed(2);" osv osv med det samme.... eller er der en fiksere måde at gøre det på, for jeg kan se, at den vil blive ved i forhold til plads.
Naarj, det kan jeg heller ikke. Mit overblik er ikke lige så stort og drevent som dit. Lige nu har jeg det som, at der er rigtig mange forskellige legoklodser med hver deres funktion, men samtidig med mange mulige måder at sætte dem sammen på. Så jeg har besluttet mig for, at når den her regner er færdig, så vil jeg straks give mig i kast med et nyt lille javascript-projekt, i princippet underordnet hvad det er, så jeg bliver, i hvert fald, lidt bedre til det her. Uanset, dit foreslag virker som en drøm. :-)
Hvis jeg gerne vil overføre et tidligere indtastet tal til længere nede på siden, altså vise det igen, hvordan gør jeg så det?
Mit PS omhandler noget andet end regne-spørgsmålene.
Hvis du vil til at lære javascript, ville jeg anbefale dig at lære et javascript framework i stedet, f.eks. jquery. Det er langt nemmere at arbejde med end 'rå' javascript.
Der skal ikke være noget input-felt ved genvisning af tallet, for der må ikke ændres i tallet ved genvisning. Jeg har prøvet med en <span id...>, men det virker ikke.
Du skal bruge en lidt anden fremgangsmåde ved en span (som jeg også gjorde i scriptet hvor den viser "total").
En span har ikke et value variabel som et input felt har, men har i stedet noget indhold mellem de to span tags. Den nemmeste måde er, at bruge innerHTML, der blot indsætter indholdet af f.eks. en variabel direkte.
var test = "hej"; document.getElementById("span_tag_id").innerHTML = test;
var test = "hej"; document.getElementById("span_tag_id").innerHTML = test;
<span id="span_tag_id"></span>
Men "hej" er jo en predefineret sag, mens userinputtet er forskelligt fra gang til gang. Hvis user skriver 2 i a-feltet, så vil jeg gerne have, at den længere nede på siden viser 2, uden at de kan pille ved tallet (derfor bør den ikke sættes som et input-felt), men som et span-felt - noget der gengives og ikke kan røres ved.
Jeg har defineret felterne g, h og i. Jeg har sat var-beregningen for ghi og vis total for ghi. Den beregner fint det som den står på som default (g 50), da jeg har en span der viser id="totalg", men hvordan får jeg den til, at vise de andre beregninger, trykker user på f.eks. h (100)?
Du kan ikke gøre det op den måde, da select boxe ikke fungerer som input felter. Vi er vist efterhånden også nået et godt stykke udover det spørgsmål du stillede?
Her et eksempel. <script> function dropdown_value() { select_element = document.getElementById('input_g'); input_g = select_element.options[select_element.selectedIndex].value; alert(input_g); }
Jeg kan ikke få den sidste del med option til at virke. De tre muligheder skal ganges op med userinput c.
Jeg ville nu bare give dig et gavekort for din hjælp. Jeg synes ikke, man kan bruge 200 pt til ret meget. Men er 200 pt for dig lykke, så alright. Jeg vil da i hvert fald takke for din hjælp.
Jeg forstår ikke hvad du mener med 'de tre muligheder'? Er det dem fra dropdown boksen?
Du kan smide dem her op i beregn funktionen: select_element = document.getElementById('input_g'); input_g = select_element.options[select_element.selectedIndex].value;
Lære at svare sådan, hvad mener du med det? Som sagt, det er helt fint med mig, at du blot vil have 200 pt. Ikke at jeg forstår det, men sådan er der så meget.
Jeg slutter af her, inden det bliver for mystisk. Tak for hjælpen.
Det var nu bare en kommentar til mit indlæg #34, men fair nok. Held og lykke med det.
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.