Autor Zpráva
Pavlínka
Profil
Mám zde ještě jeden problém který ne a ne vyřešit :D

potřebovala bych cosi co dokola bude načítat obrázek ... ale než začne načítat další tak vyzobrazí první
ale s tím, že obrázek se může zobrazit až po tom, co se načetl...

prozatím jsem tady, ale obrázek problikuje což pravděpodobně znamená nezobrazení až po načtení:

<div id="nactiobr"></div>


    <script language="JavaScript">
function nacti() {
var img = new Image();
img.src = "webcam/webcam.jpg?t="+(new Date().getTime());
img.onload = function () {
                document.getElementById('nactiobr').innerHTML = 
                    '<img src="'+img.src+'"/>';
nacti();
}
}
    </script>
Keeehi
Profil
Pavlínka:
To co jsi vytvořila vlastně ten obrázek stáhne, když je stažený tak ty data vůbec nepoužije a vytvoří nový obrázek, který stáhne zase ty samá data. Je to sice neefektivní, ale pokud by správně fungovala keš, ničemu by to vadit nemělo. Kvůli keši by se to druhé stahování nepustilo a použila by se ta stažená data. Záleží tedy, jaké hlavičky posílá server, když odesílá obrázek. No a nebo to uděláš pořádně a použiješ ten obrázek, který jsi vytvořila.

function nacti() {
    var img = new Image();
    img.src = "webcam/webcam.jpg?t="+(new Date().getTime());
    img.onload = function () {
        var parent = document.getElementById('nactiobr');
        var oldImage = parent.firstChild;
        if(oldImage) {
            parent.replaceChild(img, oldImage);
        } else {
            parent.appendChild(img);
        }
        nacti();
    }
}
Pavlínka
Profil
podle firefoxu mi tento script načítá obrázky tak rychle, že se na webu vlsatně žádný nezobrazí :D
v podstatě to nečeká než se stahne a ihned načítá další v reálu se pak stahují 3-5 obrázků najednou..
alepoň podle access a firefoxu

takže je něco asi špatně...

v zásadě mě napadla ještě jedna varianta kde by jsem použila první možnost ale obrázky by měli z-index a přes sebe by se překrývali...
problém by ale asi byl v tom, že po čase by byla hodnota sta tisícová a nevím co by to udělalo s samotným prohlížečem po delší době... :(
Keeehi
Profil
Pavlínka:
v podstatě to nečeká než se stahne a ihned načítá
To není možné. Pokud nepouštíš funkci nacti i někde jinde, nemá ji co jiného spustit než řádek 12. Takže v té době by měl být obrázek už i zobrazený v prohlížeči. To, proč to je tak rychlé je dané tou keší. Tvůj antikešovací string má rozlišení jen celou sekundu. Takže když se obrázek stáhne, ty to spustíš znovu a pokud se to celé vejde stále do té jedné vteřiny, ten obrázek už v keši je > nemusí se stahovat > začne se to strašně rychle cyklit. Ono už jsi na to byla upozorňovaná ve vedlejším vlákně, že tohle opakované volání na konci nebude asi nejlepší nápad.
Když řádek 12 vyměníš za tohle window.setTimeout(nacti, 1000);, bude se funkce nacti spouštět jednou za vteřinu, což vlastně chceš.

Nebo musíš zvýšit rozlišovací schopnost antikešovacího stringu. Buď do toho přidáš milisekundy (což by mohlo snad být dostatečné), nebo tam budeš generovat pokaždé něco náhodného. Ale musí to být opravdu náhodné a velké, což není úplně nejjednodušší.

Použil bych ten setTimeout, dává tu největší smysl.
Pavlínka
Profil
Keeehi:
Tvůj antikešovací string má rozlišení jen celou sekundu
(new Date().getTime())
to přece tvoří microtime nikoli time tudíš milisekundy? nebo se pletu?



To není možné
no asi něco dělám špatně, ale nevidím co... :(
obrázky se sice stahují ale nezobrazují, z návodů co jsem prošla by to takto ale fungovat mělo...
Živá ukázka
_es
Profil
Pavlínka:
Predpokladám, že obrázok nemení rozmery, takže by mali byť nastavené v HTML, aby sa odstránilo nejaké „preblikávanie". Možno by sa zlepšilo zobrazovanie, ak by to boli dva obrázky, čo by sa prekrývali a „dočasným“ na stiahnutie obrázka by bol ten skrytý a po stiahnutí sa zobrazil. Mohlo by však stačiť:

<img id="obr" width=šírka height=výška></img>
<script>
var tmp = new Image(), obr = document.getElementById('obr');
tmp.onload = function(){obr.src = tmp.src; nacti()};
function nacti(){tmp.src = "webcam/webcam.jpg?t="+(new Date().getTime());}
nacti();
</script>
Pavlínka
Profil
_es:
vypadá to dobře...
ale proč mi to ignoruje setTimeout?
Živá ukázka


nějak přestávám JS chápat :D
pcmanik
Profil
Pavlínka:
tmp.onload = function(){obr.src = tmp.src; nacti()};
Zvýraznené tam nemá byť.
Pavlínka
Profil
pcmanik:
Zvýraznené tam nemá byť.

to mě také napadlo různě jsem s tím experimentovala ale pak se funkce buď vůbec neopakovala nebo to setTimeout ignorovalo :D
_es
Profil
pcmanik [#8]:
To by sa to predsa ale načítalo len raz.

Pavlínka:
ale proč mi to ignoruje setTimeout?
Čo na tom „nefunguje“? Načítavanie obrázka začne až za 5 sekúnd po načítaní „živej ukážky“ a potom ho prehliadač načítava opakovane „koľko vládze“ bez pauzy. Malo by to robiť niečo iné? Mala by byť pauza po každom načítaní obrázka? To ale potom logicky musíš dať setTimeout inam.
Pavlínka
Profil
_es:
To by sa to predsa ale načítalo len raz.
chci to použít u webkamy proto je účelné opakování funkce...

potom ho prehliadač načítava opakovane
a to neni samozřejmě pravda... když odmažu viz "pcmanik" tak se script neopakuje,
když odmažu viz "pcmanik" tak se script načte pouze jednou a ani vyvoláním funkce na konci nemění problém znovunačtení,
když do stejného místa vložím setTimeout (nebo na konec scriptu) script jej ignoruje... :D


_es:
jiným slovem... to co jsi napsal je super.... kdyby se tam dalo dostat setTimeout bylo by vše vyřešené :D (22 obrázků za sekundu je v tomto případě celkem zbytečné)
Keeehi
Profil
Pavlínka:
to přece tvoří microtime nikoli time tudíš milisekundy? nebo se pletu?
Máš pravdu, čekal jsem tam desetinnou tečku a to mě zmátlo.

když do stejného místa vložím setTimeout (nebo na konec scriptu) script jej ignoruje
Ukaž.
_es
Profil
Pavlínka:
když odmažu viz "pcmanik"
Ale je predsa píšem o stave, keď to necháš tak, ako to je.

když do stejného místa vložím setTimeout (nebo na konec scriptu) script jej ignoruje... :D
Ako ignoruje? Veď načítavanie obrázka začne až po 5 sekundovej pauze po načítaní „ukážky“. Keď dám namiesto 5000 60000, tak sa obrázok zobrazí až po minúte.
Keeehi
Profil
_es:
Ako ignoruje?
Myslím, že se baví o kódu z [#6] kde na řádku 4 nahradí nacti(); za setTimeout(nacti, 1000);
_es
Profil
Keeehi [#14]:
No veď ale na to som sa pýtal už v [#10], keď som skúšal tipovať, o čo sa vlastne snaží, lebo to dostatočne zrozumiteľne nepopísala.

Pavlínka:
A po úprave z [#14] samozrejme nemá zmysel dávať setTimeout tam, kde je v [#7].
Keeehi
Profil
Jinak mě to co jsem psal [#2] s úpravou se setTimeout funguje nádherně. Odkaz
Pavlínka
Profil
ehmmm

už mi došlo kde je chyba :D
Živá ukázka

holt jsem blond no, nebíte mě :D

děkuji za pomoc :)


Keeehi:
v tomto případě obrázek "problikává
v případě kódu od _es nikoli :)
Keeehi
Profil
Pavlínka:
v tomto případě obrázek "problikává
v případě kódu od _es nikoli :)
Mně tedy neproblikává, takže to nemohu otestovat, ovšem pokud _esovým řešením je přidat obrázku rozměry, tak to přece není problém. Odkaz

Možná by stačily rozměry pomocí css?
_es
Profil
Keeehi:
Tvoje riešenie zahŕňa manipuláciu s DOM, čo môže byť niekedy dosť náročné - záleží aj od konkrétneho okolitého HTML kódu a implementácie v prehliadači. Najefektívnejšie, čo ma napadá, by bolo riešenie spomenuté v [#3], že by by bol jeden obrázok prekrytý druhým a len by sa jednému menil CSS z-index, tak, aby sa zobrazovali striedavo. Samozrejme obrázky by boli len dva, nie ako špekulovala Pavlínka.
Bubák
Profil
_es:
len by sa jednému menil CSS z-index
Anebo display z inline block na none, případně měnit visibility.
Anebo měnit text-indent, jak to svého času habendorf vymyslel pro hovef efekt.
_es
Profil
Bubák [#20]:
Z toho sa hodí len visibility, iné možnosti môžu teoreticky ovplyvniť zvyšok stránky, teda nie sú vhodné na časté prekresľovanie.
ServIT
Profil
Pavlínka:
No ja tedy nevím, ale při tmp.onload = function(){obr.src = tmp.src; nacti()};

se funkce spustí jen jednou , a jeji výsledek se uloží do onload

správně má být tmp.onload = "function(){obr.src = tmp.src; nacti()};"

Chili funkci šlehnout do uvozovek...
Radek9
Profil
ServIT:
Co prosím? o_O Ta funkce se nevolá. Pouze se uloží do onload (tedy nikoli výsledek té funkce). A navíc kdykoli píšeš kód do stringu, děláš to špatně.
_es
Profil
ServIT [#22]:
Určite nie, má tam byť funkcia, nie textový reťazec. Možno to v niektorých prehliadačoch bude fungovať aj s reťazcom, no nie je to dobrý nápad: Časté potíže, zajímavosti a poučné debaty » Nepoužívejte eval, ani jeho obdoby
Keeehi
Profil
ServIT:
Aby se zavolala, muselo by to být myslím takto tmp.onload = function(){obr.src = tmp.src; nacti()}();
_es
Profil
ServIT:
se funkce spustí jen jednou , a jeji výsledek se uloží do onload
Nie, viď Časté potíže, zajímavosti a poučné debaty » Rozdíl mezi voláním funkce a funkcí a [#25].

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: