| | |
| Stránka: 1 z 1
| [ Príspevkov: 23 ] | |
Autor | Správa |
---|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal camo: 24.06.2010 22:21 | |
|
!!!!!Dobrý večer!!!!!
Mám takýto kód, ktorý mení priehľadnosť elementu:
Kód: <!DOCTYPE HTML public "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> <meta name="generator" content="PSPad editor, www.pspad.com"> <title></title> <script type="text/javascript">
var glob=0; var casovac='' function opacitka(ID){ casovac=setInterval("timeout(ID)",50); }
function timeout(ID2){ glob++; glob++; if(document.all) document.getElementById('Ja').filters.alpha.opacity=glob*10; else ID2.style.opacity=glob/10; if(glob==10) clearInterval(casovac); } </script> </head> <body style="text-align:center"> <div style="background-color:black; width:209px; margin:0 auto"> <img id="JA" src="fotkamna.jpg" style="opacity:0; filter:alpha(opacity=0)" onmouseover="opacitka(this)" /> </div>
</body> <!-- onmouseover="this.filters.alpha.opacity=100; this.style.opacity=1; " onmouseout="this.style.opacity=0.4;this.filters.alpha.opacity=40" --> </html>
A neviem ako predať objekt this do funkcie timeout(ID). Niekde tam sa to zasekne.
Chybová konzola píše: ID is not defined
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 25.06.2010 7:57 | |
|
nenijesom specialissta na javascript , ale ked som ja riesil taketo nieco tak som ID mal ako globalnu premennu lebo casovac sa spusta asynchronne cize bezi v samostatnom threade.
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal autor témy camo: 25.06.2010 9:09 | |
|
Áno skúšal som to aj s globálnou premennou, ale nič.... Mňa zaujíma hlavne, prečo nie je schopná tá funkcia predať ten objekt... Asi preto, že sa to predáva ako reťazec a teda sa tam stráca ten objekt. Ale skúšal som to fakt aj s tou globálnou premennou a aj tak to blblo. Skúsim to ešte raz napísať s tou globálnou...
To, že je niečo asynchrónne, by podľa mňa na to nemalo mať vplyv.
EDIT:
Tak som to urobil cez tú globálnu a dnes to funguje. Musela tam byť ešte nejaká iná chyba...:
Kód: <script type="text/javascript">
var glob=0; var casovac=''; var IDcko=''; function opacitka(ID){ IDcko=ID; casovac=setInterval("timeout()",50); }
function timeout(ID2){ glob++; glob++; if(document.all) IDcko.filters.alpha.opacity=glob*10; else IDcko.style.opacity=glob/10; if(glob==10) clearInterval(casovac); } </script> </head> <body style="text-align:center"> <div style="background-color:black; width:209px; margin:0 auto"> <img id="JA" src="fotkamna.jpg" style="opacity:0; filter:alpha(opacity=0)" onmouseover="opacitka(this)" /> </div>
Dalo by sa to napísať lepšie - a ako?
Naposledy upravil camo dňa 25.06.2010 9:17, celkovo upravené 1
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 25.06.2010 9:16 | |
|
globalnu premennu nemas pouzit na vstupe funkcie ale priamo sa na nu odkazovat v tele funkcie a hlavne si osetri clearovanie casovaca aj v pripade viacnasobneho vyvolania onmouseover !
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal autor témy camo: 25.06.2010 9:20 | |
|
Zdá sa, že píšeš, ešte k tomu needitovanému príspevku...
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 25.06.2010 9:22 | |
|
ano pisal som este ktomu needitovanemu
EDIT :
tiez nerozumiem tomuto :
Kód: function timeout(ID2){ --naco davas na vstup to ID2 ? glob++;--preco incrementujes o 1 glob++;--a tu zase ? if(document.all) IDcko.filters.alpha.opacity=glob*10; else IDcko.style.opacity=glob/10; if(glob==10) clearInterval(casovac); }
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal autor témy camo: 25.06.2010 9:58 | |
|
To ID2 tam ostalo omylom, ešte z predchádzajúceho pokusu predať ID cez setInterval.
To druhé bola len pohodlnnosť. Najprv som mal len glob++ a nechcelo sa mi to prepisovať na glob=glob+2, tak som to dal dvakrát(tam neni čo chápať).
Teraz mám ale iný problém.
Kód: <script type="text/javascript">
var glob=0; var casovac=''; var uncasovac=''; var IDcko=''; function opacitka(ID){ IDcko=ID; casovac=setInterval("timeout()",50); }
function unopacitka(ID){ uncasovac=setInterval("untimeout()",50); } function timeout(){ glob++; glob++; if(document.all) IDcko.filters.alpha.opacity=glob*10; else IDcko.style.opacity=glob/10; if(glob==10) clearInterval(casovac); } function untimeout(){ glob--; glob--; if(document.all) IDcko.filters.alpha.opacity=glob*10; else IDcko.style.opacity=glob/10; if(glob==0) clearInterval(uncasovac); } </script> </head> <body style="text-align:center"> <div style="background-color:black; width:209px; margin:0 auto"> <img id="JA" src="fotkamna.jpg" style="opacity:0; filter:alpha(opacity=0)" onmouseover="opacitka(this)" onmouseout="unopacitka(this)" /> </div>
</body>
Ak si to pomaly vyskúšaš, tak všetko funguje. Onmousover fotku zvidiťeľní, onmouseout naopak. ALE keď to urobíš rýchlejšie ako prebehne cyklus, tak sa tu zacyklí a bliká donekonečna. Totiž každý cyklus(onmouseover/onmouseout) ukončuje podmienka s porovnaním hodnoty glob. Ale ak pred ukončením cyklu, nastaví opačný cyklus glob na inú hodnotu pred ukončením inkrementácie/dekrementácie, tak sa ku koncu nikdy nedostane a navzájom si prepisujú túto premennú...
A teraz neviem čo.....
Založiť pre každý cyklus inú premennú......?
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 25.06.2010 10:40 | |
|
ved som ti hovoril ze je to asynchronny proces beziaci ako samostatny thread
najrychlejsie aj ked mozno nie najcistejsie riesenie :
Kód: function opacitka(ID){ IDcko=ID; clearInterval(uncasovac); casovac=setInterval("timeout()",50); }
function unopacitka(ID){ clearInterval(casovac); uncasovac=setInterval("untimeout()",50); }
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 Bydlisko: Brno | Napísal Ďuri: 25.06.2010 12:53 | |
|
Pisat kod do retazca, to je fakt prasacina.
Kód: function neviemco(arg) { setInterval(function() { timeout(arg); }, 50); }
Este doplnim: Citácia: if(document.all) IDcko.filters.alpha.opacity=glob*10; Toto je velka chyba. Preco testujes podporu jednej veci, a pritom menis druhu? Je celkom pravdepodobne, ze bude existovat prehliadac, kde document.all existuje, ale uz pouzitie IDcko.filters.alpha vyhodi chybu, lebo IDcko.filters neexistuje.
Pouzi podmienku na testovanie, ci existuje IDcko.filters.
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal autor témy camo: 25.06.2010 17:02 | |
|
Coldak: už som na to myslel, že treba v každom cykle zmazať opačnú premennú casovac/uncasovac. Ešte to budem musieť dopísať.
Ďuri: Tým kódom v reťazci asi myslíš to volanie steInterval("funkcia()",50).
Lenže tak to je aj na JPW aj na W3school. A mám to ešte v pamäti, že keď som to riešil prvý krát tak ma na to niekto upozorňoval. A mi povedz, prečo to tak je? Písať kód funkcie do zátvoriek inej f. to sa teda podĺa mňa na krásu nepodobá ani náhodou.
To testovanie mi v JS moc nejde. Prečo sa napr. testuje IDcko.filters a nie IDcko.filters.alpha. Totiž som také niečo skúšal napísať pred tým, ale akosi mi to nefrčalo. Možno som tam mal ešte inú chybu...neviem. Tak som tam dal to, čo vidím v testoch bežne. Ak sa môžem spýtať, tak ktorý browser podporuje ešte document.all?
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 Bydlisko: Brno | Napísal Ďuri: 25.06.2010 19:51 | |
|
Ano, myslim to volanie.
Viem, ze v mnohych kodoch sa to tak uvadza, ale je to zle, prakticky ako keby si pouzival eval(). Mozes si prejst aj par prispevkov na djpw.cz, kde sa toto casto vycita. Vznika vtedy hlavne problem s parametrami nadradenej fcie, ku ktorym nemozes pristupovat, presne s tym si sa stretol aj ty, dam ti priklad:
Kód: var g = 0; //toto je globalna premenna g (function(g) //toto je anonymna fcia s parametrom nazvanym tiez g { setTimeout("alert(g)", 1); //pokus o vypisanie hodnoty parametra fcie, z ktorej setTimeout volame })(1); //tuto anonymnu fciu okamzite volame a parameter g dostava hodnotu 1
Mozes si tento kod spustit a uvidis, ze ti vyhodi 0. Pouzil si skarede zle eval a to pristupilo ku globalnej premennej. Prave tu vyuzijes vyhodu tzv. closure, ktora dokaze pristupovat k parametrom nadradenej fcie: Kód: var g = 0; (function(g) { setTimeout(function() { alert(g); }, 1); })(1);
Niektori experti dokonca spravia to, ze zapisu ako parameter setTimeoutu toto: "alert("+g+")", cim ale predaju volanej fcii iba hodnotu, nie samotnu premennu/parameter, co robi uz pri retazcoch problemy, nehovoriac o objektoch. A v neposlednom rade, pri pouziti closure ti funguje aj zvyraznovac syntaxe v editore Co sa tyka filters, nemozes kontrolovat atribut objektu, pokial nevies, ci existuje samotny objekt. Pozri: Kód: var o = { foo: 1, bar: 2 }; alert(typeof o.qux); Toto bez problemov vyhodi undefined - objekt o existuje, neexistuje iba jeho atribut qux, pretoze o ma len 2 atributy foo a bar. Keby si zmazal prvy riadok a pouzil rovno typeof o.qux bez zadefinovania o, skonci to chybou. Preto nemozes pozerat atribut alpha objektu nieco.filters, ak nevies, ci nieco.filters existuje. Ak ti je pribuznejsie PHP, podobne mozes spravit Kód: $pole = array('foo'=>1, 'bar'=>2); echo isset($pole['qux']) ? 1 : 0;
Ale uz nemozes pouzit rovno isset($pole['qux']) bez definovania $pole, lebo pritomnost $pole nikde neoverujes.
A co sa tyka document.all? Fiha, vyzera to tak, ze nove verzie prehliadacov to uz odstranili, ale nikdy nevies. Na tuto temu si mozes pozriet clanok Psi zivot na Webylone, je tam napisane akurat o document.all. A vobec, ak jes parky stale s horcicou, nejdes sa do chladnicky pozriet na horcicu, aby si zistil, ci mas parky. Chapeme?
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal autor témy camo: 25.06.2010 20:25 | |
|
Ďuri:
No moc vďaka za prácu nad čas...
Máš to u mňa(volako...(napíš adresu pošlem čokoládu).
Myslím, že chápem aj keď s tou anonymnou funkciou si mi trochu zavaril.
Ešte idem prečítať ten Webylon.
PS:Ja sa niekedy idem pozrieť aj na to, či máme horčicu a či má teda vôbec zmysel rozmýšľať nad párkami....
PS2:Ten model 'fcia("g")',... som skúšal aj ja, keď som už bol na dne
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 26.06.2010 21:19 | |
|
duri, ano pristup ktory najprv otestuje existenciu objektu alebo jeho vlastnosti je urcite lepsi ako otestovat typ browsera. kedysi som sa trapil s problemom otestovania pritomnosti helpera ktory som si sam nakodil a loadol do IE no ked som ho chcel otestovat Kód: if (window.external.helperxxx) {} stale mi to padalo na chybe nakoniec som to riesil cez try {} catch () {} . vies poradit nejake elegantnejsie riesenie ? dik
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 Bydlisko: Brno | Napísal Ďuri: 27.06.2010 8:40 | |
|
Hm, aku chybu to hadzalo? Zaujimave, napadlo mi testovat to poriadne pre prehliadace, ktore window.external nepodporuju:
Kód: if (window.external && window.external.helperxxx) {} ale to neriesi problem s Explorerom.
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 27.06.2010 10:42 | |
|
no nechtiac som ta zavadzal lebo som si uz nepamatal ale prezrel som kody a neslo to takto Kód: <script> if(window.external.debug) { debug = function(message) {window.external.debug(message);}; } else { debug = function(message) {}; }; </script> hadzalo to chybu "Object doesn't support this property or method at line..." ale ked som to zmenil takto : Kód: <script> if(typeof window.external.debug == "unknown") { debug = function(message) {window.external.debug(message);}; } else { debug = function(message) {}; }; </script> tak to uz islo v pohode, takze nakoniec som try {} catch() {} nemusel pouzivat aj ked som ho urcite skusal nez som prisiel na tento sposob testovania. bolo by zaujimave popisat kedy aky typ objektu v akom prehliadaci akym sposobom testovat.
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 Bydlisko: Brno | Napísal Ďuri: 27.06.2010 11:05 | |
|
Ten tvoj zmeneny kod by sa mal stale hodit do vetvy else. Typ unknown v Javascripte neexistuje.
K tvojmu kodu ti nemam moc co povedat, lebo s window.external som nikdy nerobil, ale plati, ze nedefinovane premenne a atributy objektov maju typ undefined.
Co sa tyka kontroly, ci nieco existuje, najspolahlivejsie je pouzit typeof. Este je tu jedna zaujimavost - ak pouzijes v beznom kode neexistujuceho clena objektu, ten len vrati undefined, zatialco ak pouzijes referenciu na globalnu premennu, to uz hodi ReferenceError:
Kód: try { if (marha) alert('Premenna existuje'); else alert('Premenna neexistuje'); } catch (e) { alert(e); } //ReferenceError: marha is not defined A (takmer) ekvivalentny kod: Kód: try { if (window.marha) alert('Premenna existuje'); else alert('Premenna neexistuje'); } catch (e) { alert(e); } //Premenna neexistuje Ale ako som povedal, staci proste typeof cokolvek === 'undefined' a funguje to vzdy.
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 27.06.2010 11:33 | |
|
v klasickom javascripte asi unknown nema zmysel ale v IE je to prevdepodobne koli activeX objectom . unknown neznamena ze definicia neexistuje ale ze definicia je neznama aj ked existujuca. zase dalsia feature internet explorera ktora sice na jednej strane pridava dalsie moznosti no na druhej strane vytaca coderov koli nekompatibilite.
EDIT: ako by vyzeral test ak by sa vyuzila moznost pristupovat k metodam alebo vlastnostiak ako k prvkom pola ?
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 Bydlisko: Brno | Napísal Ďuri: 27.06.2010 11:52 | |
|
Hm, tak k tomu unknown ti fakt viac neviem povedat, ja tieto propertialne srandy JScriptu nepoznam. Ale ani msdn nepise nic o unknown ( link), takze neviem.
coldak píše: EDIT: ako by vyzeral test ak by sa vyuzila moznost pristupovat k metodam alebo vlastnostiak ako k prvkom pola ? Celkom som nepochopil. Ono zapisy foo.bar a foo['bar'] su ekvivalentne, takze je uplne jedno, ci zapises if (foo.bar) alebo if (foo['bar']) alebo if ('bar' in foo) (alebo zasa pomocou typeof).
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 27.06.2010 12:35 | |
|
Ďuri píše: Celkom som nepochopil. Ono zapisy foo.bar a foo['bar'] su ekvivalentne, takze je uplne jedno, ci zapises if (foo.bar) alebo if (foo['bar']) alebo if ('bar' in foo) (alebo zasa pomocou typeof).
ano presne tento zapis som myslel aj ked niekde som zazrel este aj funkciu grep() . myslel som ze ta to bude mat nejak osetrene ale chova sa presne ako Object["property"].
takze zhrnutie:
ak v IE zavolam helper s nazvom debug pomocou :
Kód: alert(window.external["debug"]); spadne na chybe "Object doesn't support this property or method..." zistenie typu objectu Kód: alert(typeof window.external["debug"]);
vrati "unknown". Samozrejem to plati iba ak dany helper je nainstalovany! ak nieje nainstalovany tak oba pristupy vracaju "undefined".
mozno toto niekomu niekedy pomoze
|
|
Registrovaný: 21.09.09 Prihlásený: 03.08.10 Príspevky: 229 Témy: 43 | Napísal DARSON: 05.07.2010 14:46 | |
|
Ja len tak okrajovo...
Ta zmena opacity vobec nie je plynula.
Namiesto Kód: casovac=setInterval("timeout()",50); pouzi Kód: casovac=setInterval("timeout()",5); a namiesto Kód: glob++; glob++; pouzi Kód: glob=glob+0.1;
Rychlost je uplne rovnaka aku si mal ty a je to 10-krat plynulejsie.
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 05.07.2010 18:55 | |
|
DARSON píše: Ja len tak okrajovo... Ta zmena opacity vobec nie je plynula. Namiesto Kód: casovac=setInterval("timeout()",50); pouzi Kód: casovac=setInterval("timeout()",5); a namiesto Kód: glob++; glob++; pouzi Kód: glob=glob+0.1; Rychlost je uplne rovnaka aku si mal ty a je to 10-krat plynulejsie.
bude to rovnake aj pri prehliadacoch s lepsim alebo horsim renderovanim a pri PC s inym vykonom ?
|
|
Registrovaný: 21.09.09 Prihlásený: 03.08.10 Príspevky: 229 Témy: 43 | Napísal DARSON: 05.07.2010 19:50 | |
|
To som neskusal, ale ak pouzijes to prve riesenie, bude to zle vo vsetkych prehliadacoch a na vsetkch pocitaoch. Ak pouzijes to moje (duhe) na novych PC to bude OK a na starsichy to (predpokladam) nebude o nic horsie ako to tvojje prve riesenie...
|
|
Registrovaný: 05.09.09 Príspevky: 1141 Témy: 127 Bydlisko: Lehota pod ... | Napísal autor témy camo: 05.07.2010 21:25 | |
|
A vieš, že o to vôbec nešlo?
|
|
| Stránka: 1 z 1
| [ Príspevkov: 23 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|