Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: JS ongelma->olio ei välity funktiolle?

Paulus M [09.06.2009 13:10:56]

#

yritän kutsua funkiota pyorita parametrillä "ani", mutta tulee vihreilmoitus.

missing ] after element list
[Break on this error] pyorita([object Object],0,0,51,1)

tässä on kutsu:

pyorita(ani, 0, 0, 51, 1);

tässä on animaattori objekti ja pyöritä funktio:

var ani = new Ani();
...
function Ani() {
	this.animaatiot = [];
	this.ajat = new Array(20);	//max 20 animaatiota.
	for(var i = 0; i < 20; i++)
	{
		this.ajat[i] = -1;
	}
	this.lataa = lataakuvat;
	this.onkoKuvatLadattu = checkKuvatLadattu;
}
....
function pyorita(animator, tyyppi, kuvanro, pituus, aninumber)
{


	if(animator.ajat[aninumber] < pituus)
	{
		animator.ajat[aninumber]++;
		document.images[kuvanro].src= animator.animaatiot[tyyppi][animator.ajat[aninumber]];
		setTimeout("pyorita(" + animator + "," + tyyppi + "," + kuvanro + "," + pituus + "," + aninumber + ")", 30);

	}


}

En millään keksi miksi en voi välittää "ani" objektia parametrillä "animator"? Tai mistä kohdin puuttu sulkumerkki ]?

Grez [09.06.2009 14:26:48]

#

SetTimeoutin ensimmäiseksi parametriksi annat tällaisen merkkijonon:

"pyorita(" + animator + "," + tyyppi + "," + kuvanro + "," + pituus + "," + aninumber + ")"

Eli kun tuo merkkijono muodostetaan, niin siitä tulee

"pyorita([object Object],0,0,51,1)"

Eli kutsut:

setTimeout("pyorita([object Object],0,0,51,1)",30);

Siitä voitkin sitten päätellä, miksei toimi.

En keksi, miten funktiolle parametrina annetun objektin nimen funktion ulkopuolella voisi päätellä funktion sisältä, joten ehdotan jotain tällaista lähestymistapaa:

var ani = new Ani();
//...
function Ani() {
    this.animaatiot = [];
    this.ajat = new Array(20);    //max 20 animaatiota.
    for(var i = 0; i < 20; i++)
    {
        this.ajat[i] = -1;
    }
    this.lataa = lataakuvat;
    this.onkoKuvatLadattu = checkKuvatLadattu;
}
//....
function pyorita(animatorname, tyyppi, kuvanro, pituus, aninumber)
{
	var animator=eval(animatorname);

    if(animator.ajat[aninumber] < pituus)
    {
        animator.ajat[aninumber]++;
        document.images[kuvanro].src= animator.animaatiot[tyyppi][animator.ajat[aninumber]];
        setTimeout("pyorita('" + animatorname + "'," + tyyppi + "," + kuvanro + "," + pituus + "," + aninumber + ")", 30);

    }
}

//pyorita-funktion ensimmäinen kutsu olisi siis tyyliin:
pyorita('Ani',0,0,51,1);

Tosin kaiken kaikkiaan tekisin tuon toisin, niin että siinä Ani-luokassa olisi "ShowNextFrame" tms funktio ja laittaisin jotain tyyliin:

setInterval('ani.ShowNextFrame()',30);

Paulus M [09.06.2009 14:52:42]

#

Ok, kiitti tiedosta, enpä olis itse kovin äkkiä ymmärtänyt tota ongelmaa.

toi esimerkki vaan aiheuttaa uuden ongelman ja firebug heittää virheilmoituksen:

animator.ajat is undefined
[Break on this error] if(animator.ajat[aninumber] < pituus)

Ilmeisesti se menettää referenssin objektiin.

mites referenssi objektiin välittyisin komennolla pyorita('Ani'....), koska Ani on periaatteessa sen "luokan" nimi. Kokeilin kyllä tuota puorita('ani'...) mutta tällä argumentilla taas virhe ilmoitus on sama, mitä ekalla kerralla.

Mutta kiitokset tiedosta, yritän nyt värkkäillä jonkun vaihtoehtoisen ratkaisun. Esim, teen vaikka ani:sta globaalin muuttujan.

Metabolix [09.06.2009 14:58:07]

#

Toinen mahdollisuus on käyttää setTimeoutin parametrina funktiota tekstin sijaan:

setTimeout(
  function() {
    pyorita(animator, tyyppi, kuvanro, pituus, aninumber);
  }, 30
);

Grez [09.06.2009 15:25:46]

#

Paulus M kirjoitti:

mites referenssi objektiin välittyisin komennolla pyorita('Ani'....), koska Ani on periaatteessa sen "luokan" nimi. Kokeilin kyllä tuota puorita('ani'...) mutta tällä argumentilla taas virhe ilmoitus on sama, mitä ekalla kerralla.

Joops, siis kutsun piti tietenkin olla pyorita('ani',0,0,51,1) eikä isolla kirjaimella.

Vastaus

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

Tietoa sivustosta