Autor | Zpráva | ||
---|---|---|---|
Pavlínka Profil |
#1 · Zasláno: 30. 1. 2017, 20:36:46
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 |
#2 · Zasláno: 30. 1. 2017, 21:15:54
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 |
#3 · Zasláno: 30. 1. 2017, 21:55:38
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 |
#4 · Zasláno: 30. 1. 2017, 23:16:10
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 |
#5 · Zasláno: 31. 1. 2017, 08:55:33
Keeehi:
„Tvůj antikešovací string má rozlišení jen celou sekundu“ (new Date().getTime()) „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 |
#7 · Zasláno: 31. 1. 2017, 10:55:49
_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 |
#8 · Zasláno: 31. 1. 2017, 11:13:07
Pavlínka:
tmp.onload = function(){obr.src = tmp.src; nacti()}; |
||
Pavlínka Profil |
#9 · Zasláno: 31. 1. 2017, 11:38:16
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 |
#14 · Zasláno: 31. 1. 2017, 12:05:46
_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 Profil |
#16 · Zasláno: 31. 1. 2017, 12:14:02
|
||
Pavlínka Profil |
#17 · Zasláno: 31. 1. 2017, 12:16:10 · Upravil/a: Moderátor (editace znemožněna) 31. 1. 2017, 19:06:11
ehm>mm
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 |
#18 · Zasláno: 31. 1. 2017, 12:36:42
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 |
#21 · Zasláno: 31. 1. 2017, 17:32:14
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 |
#24 · Zasláno: 2. 2. 2017, 19:25:11
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 |
#25 · Zasláno: 2. 2. 2017, 19:25:51
ServIT:
Aby se zavolala, muselo by to být myslím takto tmp.onload = function(){obr.src = tmp.src; nacti()}();
|
||
_es Profil |
#26 · Zasláno: 2. 2. 2017, 19:48:28
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]. |
||
Časová prodleva: 6 let
|
0