Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: AJAX ongelma funktio ei pelaa

Sivun loppuun

mika132 [27.08.2010 21:12:34]

#

Eli ongelma on aika monimutkainen, mutta yritän selittää helpoimmalla tavalla. Eli ensinnäkin. xml tallennetaan tiedot näin "etsi_data.php"stä.

Pistän vain osan koodista, koska tuo on noin 200 riviä pitkä.

<?php
	$vastaus = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><selot>";
	$selostukset = file("selostuksia.txt");
	for($n = 0; $n < $moneskokuski; $n++)
	{
			$vastaus .= "<selostus>" .
				"<kuski_$n>$user[$n]</kuski_$n>" .
			"</selostus>";
	}
		$vastaus .= "</selot>";
?>

Kun menen sivulle etsi_data.php niin se tallentaa tiedot kuten haluan.

<selot>
    <kuski_0>teuro</kuski_0>
</selot>
&#8722;
<selot>
    <kuski_1>mölli</kuski_1>
</selot>

Mutta sitten kun mennään itse index.php:hen josta pyyntö lähetetään etsi_data.php sivulle tulee firefoxin virhekonsoliin seuraavaa:
kuskitt[i] is undefined rivi 161 ja se on tässä:

for (t = 0; t < kisaajienmaara; t++) {
	var kuskitt = Pyynto.responseXML.getElementsByTagName("kuski_$t");
	kuskit[t] = kuskitt[i].childNodes[0].nodeValue; //TÄMÄRIVI
}

ja sitten tässä koko hökellys tuosta index.php:stä tai melkein.

function Kuski(kayttajanimi, Keskittyminen, Hevosvoimat)
{
	this.kayttajanimi = kayttajanimi;
	this.Keskittyminen = Keskittyminen;
 	this.Hevosvoimat = Hevosvoimat;
}
function Tarkista(kayttajanimi, Keskittyminen, Hevosvoimat) {
	if (Hevosvoimat >= HEEPOSET_1 + 1) {
		first=1;
		if (first==1) {
			Parhain_heppa_2=Parhain_heppa;
			HEEPOSET_2=HEEPOSET_1;
		}
		Parhain_heppa=kayttajanimi;
		HEEPOSET_1=Hevosvoimat;
	} else {
		if (Hevosvoimat >= HEEPOSET_2 && Hevosvoimat <= HEEPOSET_1 - 1) {
			second=1;
				if (second==1) {
					Parhain_heppa_3=Parhain_heppa_2;
					HEEPOSET_3=HEEPOSET_2;
				}
				Parhain_heppa_2=kayttajanimi;
				HEEPOSET_2=Hevosvoimat;
		} else {
			if (Hevosvoimat >= HEEPOSET_3 && Hevosvoimat <= HEEPOSET_2 - 1) {
				Parhain_heppa_3=kayttajanimi;
				HEEPOSET_3=Hevosvoimat;
			}
		}
	}
first=0;
second=0;
}
function Start() {
	alustaPyynto();
	merkki=2;
	Pyynto.onreadystatechange = Startt;
	Pyynto.open("POST", "etsi_data.php", true);

	Pyynto.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	Pyynto.send("data=" +merkki);
}
function Startt() {
	var i = 0;
	var t;
	var kisaajienmaara=10;
	var autot = "";
	var kuskit = new Array();
	var Kuski = new Array();
	var hevosvoimat;
	var keskittyminen;

	if(Pyynto.readyState == 4)
	{
		if(Pyynto.status == 200)
		{
			while(Pyynto.responseXML.getElementsByTagName("kuski_1")[i] != null)
			{
				for (t = 0; t < kisaajienmaara; t++) {
					var kuskitt = Pyynto.responseXML.getElementsByTagName("kuski_$t");
					kuskit[t] = kuskitt[i].childNodes[0].nodeValue;
				}
			}

			for (var o=0; o <= kisaajienmaara; o++) {
				alert(Kuski[o] +o)
				keskittyminen=rand(1,100);
				hevosvoimat=rand(1,300);
				Kuski[o] = new Kuski(kuskit[o], keskittyminen, hevosvoimat);
				Tarkista (Kuski[o].kayttajanimi, Kuski[o].Keskittyminen, Kuski[o].Hevosvoimat);
			}
			RaceStart();
		}
	}
}

Grez [27.08.2010 21:16:14]

#

(Edit: Jälkikäteen pahoittelut siitä että viesti on vähän tympeään sävyyn kirjoitettu. Alkoi vaan ärsyttää kun tahallaan yritetään hankaloittaa vastaamista)

mika132 kirjoitti:

Pistän vain osan koodista, koska tuo on noin 200 riviä pitkä.

Arvaa paljonko kiinnostaa alkaa debugata osittaista koodia, jota ei voi sellaisenaan ajaa?

Kokonaisen koodin kanssa voi polkaista Firebugin käyntiin ja selvittää ongelman 3,7 sekunnissa. Tai sitten voi yrittää päässään pyöritellä koodia ja pähkäillä puoli tuntia mikä voisi olla vikana.

No, veikkaan silti että vika on tässä:

mika132 kirjoitti:

var kuskitt = Pyynto.responseXML.getElementsByTagName("kuski_$t");

jossa siis asetetaan kuskitt arvoksi "undefined", koska siellä ei ole tagia "kuski_$t". Ilmeisesti luulet, että merkkijonoihin voi laittaa Javascriptissä samalla tavalla muuttujien arvoja kuin PHP:ssä, vaikka muuttujasi ei edes ole $t vaan t.

Eli todennäköisesti pitäisi olla:

var kuskitt = Pyynto.responseXML.getElementsByTagName("kuski_"+t);

Edelleen en takaa että virhe on tuossa, koska en jaksa alkaa hirveän paljon tarkemmin tutkimaan - ihan sen takia että mielestäni on melko tylsää tehdä "käsin" sitä minkä tietokone tekee automaattisesti paljon näppärämmin ja nopeammin.

mika132 [28.08.2010 12:48:17]

#

Ai. En ajatellut noin. Ajattelin, että on helpompi tarkistaa, kun näkyy vain se ns. Virhe alue, mutta nyt laitan koko koodin, koska sain tälläisen ikkunan eteeni yrittäessäni mennä sivulle:

"Tällä sivulla oleva komentotiedosto on varattuna tai ei enää vastaa kutsuihin. Voit pysäyttää komentotiedoston suorittamisen tai odottaa sen suorituksen valmistumista.

Komentosarja: http://pelila.com/gameheaven/autourheilu/jokkismanager/test/:157"

Lähdekoodi pastesrvulla

Grez [28.08.2010 12:53:52]

#

No nyt on todella helppo testata kun voi laittaa sivun suoraan ajoon ja katsoa mihin se jää jumiin, kiitos.

Eli se jää tähän looppiin jumiin:

while(Pyynto.responseXML.getElementsByTagName("kuski_1")[i] != null)
{ //....

Sanoisin, että tuon voisi korjata laittamalla while tilalle if.

Yleisesti ottaen suosittelen vaikka firebugin käyttämistä, niin saat itsekin helposti selville tuollaiset ongelmat.

mika132 [28.08.2010 14:12:06]

#

Kiits. Nyt se toimii melkein. En vain ymmärrä mitä tämä virhe tarkoittaa (Firefoxin virhekonsolista):

kuskit is not a consructor

Errori viittaa riville:

Kuski[o] = new Kuski(kuskit[o], keskittyminen, hevosvoimat);

Eli se löytyy tuolta paste sivula riviltä: 169.

Grez [28.08.2010 14:28:39]

#

Mun mielestä ongelma on siinä, että sulla on globaali funktio Kuski ja sitten sulla on paikallinen muuttuja Kuski.

Eli nyt tuo paikallinen Kuski muuttuja peittää sun funktion näkyvyyden ja kun yrität luoda uuden instanssin Kuski() -funktiolla, niin Kuski ei tarkoitakaan sitä funktiota vaan paikallista muuttujaa.

Eli muuta jomman kumman nimeä.

mika132 [28.08.2010 16:57:03]

#

En voi enää uskoa tätä. Kaikki näytti toimivan melkein täydellisesti, kunnes tuli yksi suuri ongelma. Kaikki mitkä viittaavat kuskiin... Nimeen, taitoihin hevosovimiin tai aikaan niin näytetään undefinedinä. Pistän nyt koodit tähän. indexissä on siis se selostus systeemi.

Selitän vielä pari juttua miksi siellä missä selostukset etsitään on kuskit[1]
Syy on se, että yritin tulostaa ja katsoa onko yhdelläkään kuski taulukolla tulosta, mutta firefoxin virhekonsoli kertoo näistä riveistä seuraavaa:
kuskit is not defined.

indexi

etsi_data.php
Etsidatassa on rivit 8-19 tarkoituksella suljettu, kun en tarvitse noita koodissani, mutta ajattelin, että jos kuitenkin muutan sitä niin, että tarvitsen niin ei tarvitse kirjoittaa uudestaan.

ps. Suurkiitokset jos joku osaisi auttaa.

mika132 [28.08.2010 20:30:48]

#

Ongelma korjattu. Minulla oli pieni TYPO siellä, jonka löysin äsken itse ja korjasin. :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta