| Autor | Zpráva | ||
|---|---|---|---|
| Chodec Profil |
#1 · Zasláno: 23. 11. 2008, 15:48:02 · Upravil/a: Chodec
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 |
#2 · Zasláno: 23. 11. 2008, 23:06:28
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];
} |
||
| Timy Profil |
#3 · Zasláno: 23. 11. 2008, 23:34:46
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 |
#4 · Zasláno: 23. 11. 2008, 23:46:33 · Upravil/a: Chamurappi
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 |
#5 · Zasláno: 24. 11. 2008, 00:16:10
"Closure" ještě neznám, ale funguje to přesně jak jsem potřeboval.
Mockrát díky. |
||
| Leo Profil |
#6 · Zasláno: 24. 11. 2008, 12:09:44
"(lexikální) uzávěr"
uzaver nebo uzavera? Leo |
||
| Timy Profil |
#7 · Zasláno: 24. 11. 2008, 12:21:46
Leo
U nás se používá uzávěr, u Davida zase uzávěra. |
||
|
Časová prodleva: 18 let
|
|||
0