Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: JavaScript: muuttuja ei muutu

Sivun loppuun

JuustoPala [13.09.2013 18:38:14]

#

Olen tekemässä javascript koodia, joka "random"-napista arpoo numeron, "Seuraava"-napista muuttaa numeron yhden isommaksi ja "Edellinen"-napista yhden pienemmäksi.

Vain random-nappi toimii :(
Miksi?

Koodi:

function random(type)
{
if (type==1)
{
var number1=Math.floor(Math.random()*3);
}

if (type==2)
{
var number1=number1+1;
}

if (type==3)
{
var number1=number1-1;
}

var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("contentdiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","tieto/" + number1 + ".php",true);
xmlhttp.send();
}
<button onclick="random(3)">Edellinen</button>
<button onclick="random(1)">Random</button>
<button onclick="random(2)">Seuraava</button>

groovyb [13.09.2013 18:51:18]

#

esittele tuo number1 muuttuja muualla.

var number1 = 0;

function random(type)
{
if (type==1)
{
number1=Math.floor(Math.random()*3);
}

if (type==2)
{
number1=number1+1;
}

if (type==3)
{
number1=number1-1;
}
.....

JuustoPala [13.09.2013 19:01:15]

#

Ei toimi vieläkään

groovyb [13.09.2013 19:08:07]

#

mistä valittaa?

muista myös alustaa tuo number (var number1 = 0;)

JuustoPala [13.09.2013 19:33:40]

#

Siis "Edellinen"- ja "Seuraava"-napeista ei tapahdu mitään.

Lisäys:

Aa, nyt toimii, kun tein näin

number1=number1+1;

enkä näin:

var number1=number1+1;

--

En huomannut sinun ensimmäisestä kommentista tuota muutosta :D.

Kiitos ja anteeksi huolimattomuudesta!

Mod. huom: koodeista voi laittaa myös pelkät olennaiset osat.

The Alchemist [13.09.2013 22:30:08]

#

JuustoPala kirjoitti:

Siis "Edellinen"- ja "Seuraava"-napeista ei tapahdu mitään.

Sinulta kysyttiin, että mikä se virheilmoitus on, mikä tulee muita nappeja painelemalla.

Metabolix [13.09.2013 22:33:07]

#

Eihän se varmasti valita mitään; ”var x = x + 1” vain tuottaa arvon NaN.

The Alchemist [14.09.2013 08:51:15]

#

Pakostihan se jotain valittaa, jos skriptin suoritus keskeytyy virheen takia.

Yucca [14.09.2013 18:51:33]

#

The Alchemist kirjoitti:

Pakostihan se jotain valittaa, jos skriptin suoritus keskeytyy virheen takia.

Ei ”se”, siis ilmeisesti selain, yleensä anna mitään käyttäjälle näkyvää ilmoitusta, jos skriptissä sattuu virhe. Virheilmoitus tulostuu kyllä lokiin, ja ohjelmistokehittäjän pitäisi tietysti osata katsoa sieltä. Eikä var x = x + 1 aiheuta virhettä, vaikka se toki asiallisesti ottaen on päin mäntyä; siitä vain tulee x:n arvoksi NaN (”epäluku”), kuten Metabolix huomautti.

Metabolix [14.09.2013 20:31:31]

#

The Alchemist kirjoitti:

Pakostihan se jotain valittaa, jos skriptin suoritus keskeytyy virheen takia.

Kuka on sanonut, että suoritus keskeytyisi virheen takia? On sanottu vain, että napeista ei tapahdu mitään. Koodi yrittää ladata XHR:llä sivun tieto/NaN.php, ja jos sitä ei ole, ei tapahdu mitään, koska mitään virheenkäsittelyä ei ole. Epäonnistuneen latauksen voisi tietysti huomata verkkokonsolin puolelta, mutta JS:n kannalta mitään virhettä ei silti tapahdu.

Merri [14.09.2013 21:52:19]

#

<button id="edellinen">Edellinen</button>
<button id="satunnainen">Satunnainen</button>
<button id="seuraava">Seuraava</button>
// Tehdään oma klosuuri, ettei kyllästetä window-objektia kaikella turhalla.
(function() {
	// Nämä on saatavilla tämän klosuurin sisällä.
	var sivuNro = 1,
		content = document.getElementById('contentdiv'),
		xmlhttp;

	// Onko tarpeeksi moderni selain? Löytyikö elementtiä? Jos ei niin antaa olla!
	if (!window.XMLHttpRequest || !content) return;
	// Alustetaan tämä nyt vain kerran.
	xmlhttp = new XMLHttpRequest();

	// Se pätkä, jolla ladataan tavaraa.
	var lataaTieto = function lataaTieto(id) {
		// Hipsut on vakiintuneempi tapa merkitä merkkijonoja JavaScriptissä kuin lainausmerkit.
		xmlhttp.open('GET', 'tieto/' + id + '.php', true);
		xmlhttp.send();
	};

	// Mehän käytetään joka kerta tätä samaa funktiota, niin ei tehdä sitä aina turhaan uudelleen.
	xmlhttp.onreadystatechange = function xmlHttpReadyStateChange() {
		// Aina mieluummin === kuin ==.
		if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
			content.innerHTML = xmlhttp.responseText;
		}
	};

	// Sitten heivataan noita nappuloita käyttöön. Tää on DOM Level 1 -tyyliä, mutta good enough nyt.
	document.getElementById('edellinen').onclick = function edellinenClick() {
		// Pienennetään sivunumeroa.
		sivuNro--;
		// Varmistetaan ettei se mene liian pieneksi.
		if(sivuNro < 1) sivuNro = 1;
		// Tehdään latauspyyntö.
		lataaTieto(sivuNro);
	};

	// Sitten sama toisin päin.
	document.getElementById('seuraava').onclick = function seuraavaClick() {
		// Kasvatetaan sivunumeroa.
		sivuNro++;
		// Varmistetaan ettei se mene liian isoksi.
		if(sivuNro > 3) sivuNro = 3;
		// Tehdään latauspyyntö.
		lataaTieto(sivuNro);
	};

	// Ja lopuksi satunnainen sivu.
	document.getElementById('satunnainen').onclick = function satunnainenClick() {
		// Numero 1, 2 tai 3
		sivuNro = Math.floor(Math.random() * 3) + 1;
		// Tehdään latauspyyntö.
		lataaTieto(sivuNro);
	};
// Tämä koko funktio suoritetaan saman tien. Muoto siis (function(){})();
})();

En testannut, mutta todennäköisesti toimii. Sisältää paljon ajateltavaa. Kannattaa opetella ja selvitellä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta