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: 15 let
|
0