Avatar billede parisertoast Nybegynder
29. december 2009 - 11:22 Der 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.
Avatar billede intenz Novice
29. december 2009 - 11:36 #1
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>


<form action="#">
Input A: <input type="text" id="input_a"><br />
Input B: <input type="text" id="input_b"><br />
Input C: <input type="text" id="input_c"><br />
Total: <span id="total"></span><br />
<input type="button" value="beregn" onclick="beregn();">
</form>
Avatar billede parisertoast Nybegynder
29. december 2009 - 12:09 #2
>>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.

Jeg prøver lige dit script.
Avatar billede parisertoast Nybegynder
29. december 2009 - 12:19 #3
Ja, det må være det. Kan det lade sig gøre, at lave en hidden løbende calc, som så viser Total, når user indtaster næste tal (det 4. tal, tal E)...?
Avatar billede parisertoast Nybegynder
29. december 2009 - 12:22 #4
Skrev jeg E?, mener self D!

Så det bliver:

User knaster tal ind i form
User input (A): ___
User input (B): ___
User input (C): ___
Total A*B*C (resultat1): ____

User input (D): ___
osv...
Avatar billede intenz Novice
29. december 2009 - 12:41 #5
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
    }
}

</script>

<span id="errors"></span>
Input A: <input type="text" name="input_felt" id="input_a" onKeyUp="pre_beregn();"><br />
Input B: <input type="text" name="input_felt" id="input_b" onKeyUp="pre_beregn();"><br />
Input C: <input type="text" name="input_felt" id="input_c" onKeyUp="pre_beregn();"><br />
Total: <span id="total"></span>
Avatar billede intenz Novice
29. december 2009 - 12:42 #6
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.
Avatar billede parisertoast Nybegynder
29. december 2009 - 12:54 #7
Det er knagmer smart! Hvad er 500? 500 sekunder?
Avatar billede intenz Novice
29. december 2009 - 12:54 #8
Det er millisekunder, så 500 er et halvt sekund.
Avatar billede parisertoast Nybegynder
29. december 2009 - 13:00 #9
Sig mig, konflikter javascript med tables?
Avatar billede intenz Novice
29. december 2009 - 13:15 #10
Nej. Hvis du skal debugge javascript så brug firefox med firebug plugin.
Avatar billede parisertoast Nybegynder
29. december 2009 - 13:22 #11
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...
Avatar billede parisertoast Nybegynder
29. december 2009 - 13:53 #12
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 :-)
Avatar billede parisertoast Nybegynder
31. december 2009 - 10:29 #13
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. :-)
Avatar billede parisertoast Nybegynder
03. januar 2010 - 14:59 #14
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å?
Avatar billede intenz Novice
03. januar 2010 - 15:27 #15
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"?

Du kan vel bare lave:
var totalc = totalb/c;

Eller?
Avatar billede parisertoast Nybegynder
03. januar 2010 - 16:44 #16
Sikke noget skidt med folk. Godt nok mange, der har været en tur under dynerne i år.

Ja, hvorfor ikke bare definere variablen... komplicere vist det her alt for meget, kan jeg se. Vender tilbage. :-)
Avatar billede parisertoast Nybegynder
03. januar 2010 - 17:12 #17
Det virker jo self helt fint. :-)

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.
Avatar billede parisertoast Nybegynder
03. januar 2010 - 20:00 #18
Er ude at bruge toFormatNumberFix(), som nedestående

function toFormatNumberFix()
{
  var number=parseFloat(document.value);
  var finaloutput =  number.toFixed(2);
 
}

men hvordan inkluderer jeg den i <input>, når der i forvejen er en OnKeyUp? Ka man det?

PS: Kan du ikke sende mig en besked gennem sitets system?
Avatar billede intenz Novice
04. januar 2010 - 10:11 #19
Vil du indsætte det i input felterne eller i resultaterne?

I resultatet kan du bare gøre:
total = a*b*c;
total = total.toFixed(2);

Det er mere komplekst at indsætte det i input felterne, og jeg kan ikke helt se formålet med det?
Avatar billede parisertoast Nybegynder
04. januar 2010 - 15:04 #20
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.
Avatar billede intenz Novice
04. januar 2010 - 15:21 #21
Hvis du vil vise det i et input felt, kan du se hvordan jeg trak dem ud tidligere, f.eks.:
c = document.getElementById("input_c").value

På samme måde kan du indsætte en værdi i feltet hvis du bruger det 'omvendt':
document.getElementById("input_c").value = 25;

Det skal selvfølgelig pege på det rigtige id="input_c" som inputfeltet har.
Avatar billede intenz Novice
04. januar 2010 - 15:30 #22
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.
Avatar billede parisertoast Nybegynder
04. januar 2010 - 17:38 #23
Har været inde og kigge lidt på Jquery, ser rigtig spændende ud. Det skal jeg helt klart prøve :-)
Avatar billede parisertoast Nybegynder
04. januar 2010 - 18:00 #24
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.
Avatar billede intenz Novice
04. januar 2010 - 18:45 #25
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;

<span id="span_tag_id"></span>
Avatar billede intenz Novice
04. januar 2010 - 18:49 #26
Samme kode i jquery ville se sådan ud, bare lige for at vise hvor meget mere simpelt det er :)

$("#span_tag_id").html("hej");
<span id="span_tag_id"></span>
Avatar billede parisertoast Nybegynder
04. januar 2010 - 19:12 #27
Hvordan har jquery det med joomla, umbraco, sitecore etc?
Avatar billede parisertoast Nybegynder
04. januar 2010 - 19:26 #28
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.
Avatar billede intenz Novice
04. januar 2010 - 20:22 #29
Det er underordnet om det er prædefineret eller ej, så længe du har variablen til rådighed.

Hvis du f.eks. gerne vil vise 'a' et andet sted, kan du indsætte det under:
a = parseFloat(a);
document.getElementById("span_tag_id").innerHTML = a;
Avatar billede parisertoast Nybegynder
04. januar 2010 - 21:14 #30
Ok got it :-)
Avatar billede parisertoast Nybegynder
05. januar 2010 - 14:40 #31
<select onchange="pre_beregn();">
  <option id="input_g">50</option>
  <option id="input_h">100</option>
  <option id="input_i">150</option>
</select>

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)?
Avatar billede intenz Novice
05. januar 2010 - 19:52 #32
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);
}

</script>

<select id="input_g" onchange="dropdown_value();">
  <option value="50">50</option>
  <option value="100">100</option>
  <option value="150">150</option>
</select>
Avatar billede parisertoast Nybegynder
05. januar 2010 - 21:40 #33
Jeg kan af uransagelige årsager ikke komme til at sende dig en besked, kan du sende en til mig?
Avatar billede intenz Novice
06. januar 2010 - 16:57 #34
Jeg er ikke interesseret i at kommunikere internt, udover hvad jeg beslutter mig for at svare på i spørgsmålene.
Avatar billede parisertoast Nybegynder
07. januar 2010 - 11:35 #35
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.
Avatar billede intenz Novice
07. januar 2010 - 22:20 #36
Haha, ja så jeg kan lære at svare sådan :)

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;

Og så lave:
total_g = input_g*c;
Avatar billede parisertoast Nybegynder
08. januar 2010 - 14:12 #37
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.
Avatar billede intenz Novice
10. januar 2010 - 14:39 #38
Det var nu bare en kommentar til mit indlæg #34, men fair nok. Held og lykke med det.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester