Autor Zpráva
Chodec
Profil
V poli PoleObrazku mám jednotlivé obrázky.
Pak mám cyklus který po načtení každého obrázku přepíše v jiném poli konkretní hodnotu false na true.
Problém ovšem je, že když se načte jakýkoliv obrázek a je spuštěna funkce na přepsání hodnot, tak už má proměnná ce vždy hodnotu posledního klíče v poli PoleObrazku, takže se hodnota false na true přepíše jen u poslední položky. Nevíte, jak to udělat, aby se hodnoty přepsaly postupně všechny po načtení obrázků?

var PoleOnload = new Array ();
var PoleObrazku = new Array ();

PoleObrazku[0] = new Image(); PoleObrazku[0].src = "cesta1";
PoleObrazku[1] = new Image(); PoleObrazku[1].src = "cesta2";
PoleObrazku[2] = new Image(); PoleObrazku[2].src = "cesta3";

for (var ce in PoleObrazku)
{
	PoleOnload[ce] = false;
	PoleObrazku[ce].onload = function () {PoleOnload[ce] = true;};
}


UPDATE 1:

Tak se mi to nakonec podařilo pomocí funkce eval (). Jen doufám, že to není moc velká "prasárna".

var PoleOnload = new Array ();
var PoleObrazku = new Array ();

PoleObrazku[0] = new Image(); PoleObrazku[0].src = "cesta1";
PoleObrazku[1] = new Image(); PoleObrazku[1].src = "cesta2";
PoleObrazku[2] = new Image(); PoleObrazku[2].src = "cesta3";

for (var ce in PoleObrazku)
{
	PoleOnload[ce] = false;
	eval ("PoleObrazku["+ce+"].onload = function () {PoleOnload["+ce+"] = true;};");
}


UPDATE 2:

A další problém je, že když se stránka zobrazí podruhé, potřetí atd., tak už jsou obrázky uložené k cachi, takže událost onload už nikdy nenastane.
Potřebuji tedy vědět, jestli se dá nějak zjistit, zda už je obrázek načten.
Chamurappi
Profil
Reaguji na Chodce:
Jen doufám, že to není moc velká "prasárna"
Marné je tvé doufání.

1) Funkce eval je fuj.
2) Smyčka for-in se hodí na procházení objektů, ne na pole. Jedním z „ce in PoleObrazku“ je i length.
3) Spolehlivější je nastavit nejprve událost a pak teprve hodnotu, která vyvolání události zajistí.

Upravil bych tvůj skript takto:
var PoleOnload = [];
var PoleObrazku = [];
var PoleCest = ["cesta1", "cesta2", "cesta3"];

for(var  i = 0; i < PoleCest.length; i++)
{
  PoleObrazku[i] = new Image();
  (function(i) {
    PoleObrazku[i].onload = function () { PoleOnload[i] = true; };
  })(i);
  PoleObrazku[i].src = PoleCest[i];
}
Zápis s obalující „function()“ využívá tzv. „closure“, vytváří nový kontext pro proměnné, takže vnitřní „i“ je už jiné než vnější „i“ a nemění se.
Timy
Profil
OT:

Chamurappi
Zápis s obalující „function()“ využívá tzv. „closure“
Můžeme to říci i česky, alespoň u nás se používá „(lexikální) uzávěr“. Snad to nezní nijak strašidelně jako „svoz odpadků“ (Garbage collector).
Chamurappi
Profil
Reaguji na Timyho:
No vida, tohle mi už dlouho vrtalo hlavou. Dokonce jsem se zde chtěl i zeptat, jak tomu říkat česky. „Lexikální uzávěr“ zní dobře, to budu rád používat.

<mimo-téma>
Ještě by zajímalo, jak hezky a jasně přeložit ruleset v CSS.
</mimo-téma>
Chodec
Profil
"Closure" ještě neznám, ale funguje to přesně jak jsem potřeboval.
Mockrát díky.
Leo
Profil
"(lexikální) uzávěr"

uzaver nebo uzavera? Leo
Timy
Profil
Leo
U nás se používá uzávěr, u Davida zase uzávěra.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0