Till Startsidan

Skaffa webbhotell?
Läs JavaScript.nu's jämförelse av webbhotell.
Med priser från
9 kr / månad.

Genom ett samarbete får alla JavaScript.nu-
besökare dessutom 100 kr i rabatt vid beställning.


Re: returnera värde som ska visas i form

[ JavaScript.nu's Forum ] [ Viktigt om forumet ] [ JavaScript.nu's Startsida ]


Forum / returnera värde som ska visas i formulär
 Du har fortfarande inte gjort en del av de ändringar jag skrev om:
- Du har name="largeImg1" i stället för id="largeImg1", så document.getElementById("largeImg" + imgNr) blir null, och skriptet avbryts med fel (du borde sett detta som ett fel i Firebug).
- Du har en del variabler som inte deklareras med 'var', så de blir globala (pictNr, randNumber, score, points). (Det orsakar inga fel på sidan, men det är väldigt dåligt.)
- Fortfarande syntaxfel som <a href="#" return false;> och language="javascript". (I och för sig inte heller något som orsakar synliga effekter, men du borde rätta sådana fel så fort du ser dem, så att koden är i ett så bra tillstånd som möjligt när du skriver vidare på den.)
(- Jag såg nu också att du inte använder argumentet till randomInteger alls, varför?)

Sedan, för att komma till faktiska, relevanta, fel:
- Först är ju

//void threePict( int pictNr, int imgNr, int randNumber )
//if( (points == points2) || (points == points3) || (points2 == points3) )
points + points2 + points3;

ett uppenbart syntaxfel. Funktioner deklareras med "function foo(bar)", inte "void foo(int bar)" som i, säg, C. points+points2+points3 hamnar också i globalt scope och körs bara när sidan laddas. Men jag antar att detta är WIP, så *shrug*.

- document.dice.result = + points; är väldigt fel. Först är document.dice odefinierat, med 'dice' som ett div menar du nog document.getElementById('dice'). Dess .result är bara ett attribut på elementet, precis som, säg, style eller id. Att sätta det till något gör inget alls. Det jag tror att du har tänkt är att ha ett textfält med poängen. Din markup bör i så fall ändras från

<div id="dice">
<form type="text" name="result">
<option value="Score:" +points+ />
</form>
</div>

till

<form name="dice">
Score: <input type="text" name="result">
</form>

Notera att <option> är ett fält i en <select>-box, inte en textruta eller en värdehållare på något sätt, och att +points+ inte gör någonting, överhuvudtaget, eftersom det är HTML, inte JavaScript, och att det även om det vore JavaScript bara skulle evaluera point en gång, vid sidladdning. För att den ska uppdateras dynamiskt behöver du ändra den från skriptet, varje gång.
Egentligen borde man nog skriva om det som

Score: <input type="text" id="result">

För att man ska kunna komma åt fältet på modernt vis med document.getElementById.

- Till sist, din poänguträkning är flummig. När du gör

score = showRandomPict(1) + showRandomPict(2);

anropar du showRandomPict igen två gånger, så att bilderna ändras ytterligare, du vill antagligen kunna räkna ut poäng även från showRandomPict när bara en tärning ändras, och din logik följer inte vad du beskrivit.

De förslag jag ger resulterar i ungefär den här koden:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>DICE</title>
<link rel="stylesheet" type="text/css" href="dice1.css">
<script type="text/javascript">
var points1 = 1, points2 = 1, points3 = 1;

function showPict(randNumber, imgNr){
var imgUrl = "dice/" + randNumber + ".gif";
document.getElementById("largeImg" + imgNr).src = imgUrl;
}

function randomInteger(max) {
return Math.floor(max * Math.random()) + 1;
}

function showRandomPict(imgNr) {
var pictNr = randomInteger(6);
showPict(pictNr, imgNr);
if (imgNr == 1) points1 = pictNr;
if (imgNr == 2) points2 = pictNr;
if (imgNr == 3) points3 = pictNr; // Alt. en array
calcScore();
}

function threePict(pictNr,imgNr,randNumber) {
showRandomPict(1);
showRandomPict(2);
showRandomPict(3);
}

function calcScore() {
var score;
if (points1 == points2 && points1 == points3) {
score = 2 * (points1 + points2 + points3);
}
else if (points1 == points2) {
score = points1 + points2;
}
else if (points1 == points3) {
score = points1 + points3;
}
else if (points2 == points3) {
score = points2 + points3; // Alt. loopar och arrayer i kombination
}
else {
score = 0;
}
document.getElementById('result').value = score;
}
</script>
</head>
<body>
<h1>DICE GAMBLING</h1>
<hr id="roller">
<p>Roll The Dice!</p>
<div id="largeImg">
<a href="#" onclick="return false;">
<img id="largeImg1" src="dice/1.gif" alt="Tärning" onclick="showRandomPict(1);">
</a>
<a href="#" onclick="return false;">
<img id="largeImg2" src="dice/1.gif" alt="Tärning" onclick="showRandomPict(2);">
</a>
<a href="#" onclick="return false;">
<img id="largeImg3" src="dice/1.gif" alt="Tärning" onclick="showRandomPict(3);">
</a>
<p></p>
<input type="button" value="Roll All Dice" onclick="threePict();">
</div>
Score: <input type="text" id="result" value="">
</body>
</html>

 

Nä, jag får det inte att funka...
Nu är ju koden lite rörig, eftersom jag suttit och pillat fram och tillbaka.. :)

En array ska jag göra senare av poängräkningen, men känner att jag vill göra FI grejen först, så att jag har bättre koll sen. :)


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>DICE</title>
<link rel="stylesheet" type="text/css" href="dice1.css" />
<script type="text/javascript" language="javascript">


function showPict(randNumber,imgNr){
var imgUrl = "dice/" + randNumber + ".gif";
document.getElementById("largeImg" + imgNr).src = imgUrl;
}
//End function

function randomInteger() {
randNumber = Math.random();
randNumber = Math.floor(6*randNumber)+1;
return randNumber;
}
//End function

function showRandomPict(imgNr) {
pictNr = randomInteger(6);
showPict(pictNr,imgNr);
return pictNr;
}
//End function

function threePict(pictNr,imgNr,randNumber) {
showRandomPict(1);
showRandomPict(2);
showRandomPict(3);

score = showRandomPict(1) + showRandomPict(2);
points = score;
document.dice.result = + points;
}
//void threePict( int pictNr, int imgNr, int randNumber )

//if( (points == points2) || (points == points3) || (points2 == points3) )
points + points2 + points3;
//End function


</script>
</head>
<body>
<h1>DICE GAMBLING</h1>
<hr id=roller />

Roll The Dice! </p>
<div id="largeImg">
<a href="#" return false;>
<img name="largeImg1" src="dice/1.gif" alt="Ett" onclick="showRandomPict(1)" />
</a>
<a href="#" return false;>
<img name="largeImg2" src="dice/1.gif" alt="Ett" onclick="showRandomPict(2)" />
</a>
<a href="#" return false;>
<img name="largeImg3" src="dice/1.gif" alt="Ett" onclick="showRandomPict(3)" />
</a>
<p />

<input type="button" value="Roll All Dices" onclick="threePict()" />
</div>
<div id="dice">
<form type="text" name="result">
<option value="Score:" +points+ />
</form>
</div>
</body>
</html>


 
När du använder document.getElementById måste du ange namnen på elementen som id="", inte name="", jag antar att det är detta du har missat. (Om inte bör du nog posta hela koden.)

Och med den uppgiften är detta nog den enklaste lösningen:
- Ha en global array (om du inte lärt dig det än kan du använda tre separata variabler också, eller så kan du bara kolla upp det för det är inte så svårt) som innehåller värdena på tärningsslagen.
- Låt showRandomPict ändra rätt värde i arrayen (typ, dice[imgNr-1] = pictNr;).
- I slutet på showRandomPict lägger du lite kod som beräknar poängen utefter vad arrayen innehåller, och visar den i ett span.

 
När jag skriver:
document.getElementById("largeImg" + imgNr)
får jag att det "is null" i firebug.
Vad har jag gjort för fel då?

<i>Lägg till kod i funktionen i steg 2( i mitt fall threePict), så att tärningarnas värden jämförs och en poängsumma beräknas enligt följande: om två tärningar är lika, får man summan av dessa två tärningar; om alla tre tärningarna är lika, får man dubbla summan av tärningarna; i övrigt är poängen 0. Den framräknade poängen visas i den span-tagg eller textfält som du la till i HTML-koden.</i>

Detta står i uppgiften, vilka värden ska jag ha med (i vad jag gissar I-satserna)?


  Jag ser inte riktigt sammanhanget i vilket du skulle vilja använda ett returvärde av showRandomPict? Antagligen kan du bara returnera pictNr, men hur du sedan lagrar returnvärdena i variabler beror på vad du vill göra med dem.
Din kod använder för övrigt en del utdaterade/felaktiga sätt att skriva saker på, så här är bättre:

<!DOCTYPE html> (<- HTML5-doctypen)
<html>
<head>
<meta charset="UTF-8"> (<- förenklad charset-deklaration i HTML5, och den standarden kräver inte heller att du avslutar tomma taggar med />)
<title>DICE</title>
<link rel="stylesheet" type="text/css" href="Dice1.css">
<script type="text/javascript"> (<- language="javascript" behövs inte längre)

function showPict(randNumber, imgNr){
var imgUrl = "dice/" + randNumber + ".gif"; (<- deklarera imgUrl som 'var' för att den inte ska bli global, och du behöver inga if-satser om du ändå bara gör samma sak (lägger in slumptalet i strängen))

document.getElementById("largeImg" + imgNr).src = imgUrl; (<- document["namn"] är väldigt föråldrat; document.getElementById bör användas i stället. Notera att id's används i stället för name's på elementen)
}

function randomInteger(randNumber) {
return Math.floor(6*Math.random())+1; (<- du kan ha allt på en rad (tempvariabler är onödiga ibland), och undvik förresten att deklarera variabler med 'var' två gånger)
}

function showRandomPict(imgNr) {
var pictNr = randomInteger(6);
showPict(pictNr, imgNr);
return pictNr; (<- om du ska ha ett returvärde är det nog detta)
}

</script>
</head>
<body>

Roll The Dice! </p>
<div id="largePict">
<a href="#" onclick="return false;"> (<- du menade onclick="return false;", inte bara return false; som tolkas som två tomma HTML-attribut med namn "return" och "false;")
<img id="largeImg1" src="dice/1.gif" alt="Tärningsslag" onclick="showRandomPict(1)"> (<- mer beskrivande alt-text, eftersom den inte uppdateras senare)
</a>
<a href="#" onclick="return false;">
<img id="largeImg2" src="dice/1.gif" alt="Tärningsslag" onclick="showRandomPict(2)">
</a>
<a href="#" onclick="return false;">
<img id="largeImg3" src="dice/1.gif" alt="Tärningsslag" onclick="showRandomPict(3)">
</a>
</div>
<div id="dice">


<a href="#" onclick="showRandomPict(1); showRandomPict(2); showRandomPict(3); return false;">Roll all Dice</a> ("dice" är plural av "die", "dices" är inget ord)
</p>

(<- det känns semantiskt, möjligen standardsmässigt, fel att ha <form> i

, men jag är osäker)
<form name="result"> (<- ??)
</form>
</p>
</div>
</body>
</html>

Simon

 
Hej!
Jag har lite problem med en uppgift jag har fått i skolan som gäller js.
Jag har kommit en bit på vägen, men nu gäller det att returnera ett värde från funktionen shovRandomPict och sedan ska jag spara de returnerade värdena i variabler.

Jag har suttit och fixat med det...men kommer inte på nån lösning.

Skulle verkligen uppskatta hjälp. :)

Här är koden:

<snip>


Postat av Simon (213.89.103.238) den 16 April, 2011 kl 16:52:45.
Som svar på: Re: returnera värde som ska visas i form postat av L8 den 16 April, 2011 kl 15:52:02.


Svar på inlägget:


Posta ett svar:

Namn:
E-Mail:
Rubrik:
Meddelande:
Ja tack, maila mig om andra svarar på detta inlägg.
Ja tack, maila mig om andra svarar på mitt inlägg.


[ JavaScript.nu's Forum ] [ Viktigt om forumet ] [ JavaScript.nu's Startsida ]






Copyright © Omid Rouhani 1997-2022; Alla rättigheter reserverade.
Guider: [ HTML guide ] - [ JavaScript guide ] - [ DHTML guide ] - [ Perl guide ] - [ Sitemap ]