Autor | Zpráva | ||
---|---|---|---|
fos4 Profil |
#1 · Zasláno: 23. 8. 2007, 20:24:11
Zdravim muze nekdo poradit proc mne nejde toto v IE a hlasi ze nezna fci :
Object.prototype.sa = function(n,v) { /** * Pokud je to class musime to nasvati rucne jako className kuvli IE */ switch(n) { case 'class': this.setAttribute('className', v); return true; // Pokud je to neni volani fce ale je to napr. onclick="fcename" case ('onmousedown'): eval('this.onmousedown = function(event) {'+v+'};'); return; case 'width': case 'height': case 'top': case 'left': case 'bottom': case 'right': case 'offsetTop': case 'offsetLeft': case 'offsetBottom': case 'offsetRight': case 'offsetWidth': case 'offsetHeight': eval('this.style.'+n+' = v + 'px''); break; default: this.setAttribute(n,v); } } toto volam cca z necoho takoveho: function desk { function _se(o) { o.sa('onmousedown', 'alert('fungujem')'); }; this.function cr(p) { _sE(p); }' } Dekuji |
||
ah01 Profil |
#2 · Zasláno: 23. 8. 2007, 21:10:33
Už na první pohled: eval('this.style.'+n+' = v + "px''); nebo o.sa('onmousedown', "alert('fungujem')"); i když myslím, že tohle jsi se asi jen přepsal při psaní dotazu. Ale dál to zkoumat nemá cenu, ten kód je totiž děsný paskvil.
1) Pominu to, že se důrazně nedoporučuje rozšiřovat Object a přejdu rovnou k tomu hlavnímu. Jak můžeš rozšiřovat obecný Object o metodu který počítá s tím, že je volaná nad HTMLElement. Co kdybych to sa(…) zavolal třeba u Array? Mimochodem, používání názvů typu sa, _se, _sE je poněkud nic neříkající, proč nenapíšeš třeba mySetAttribute (předpokládám, že to sa je zkratka ze setArttribute)? 2) Použití fce. eval se dá ospravedlnit jen ve zcela zvláštních případech, jako je třeba zpracování JSON kódu, ale i tam to má své pro a proti. Použití jaké je vidět zde, je prostě ohavnost! Proč prostě nenapíšeš: this.style[n] = v + „px“; |
||
fos4 Profil |
#3 · Zasláno: 23. 8. 2007, 21:29:53
ah01: dekuji ze jsi mne poradil proc nejde rozsirovat object v ie..
|
||
ah01 Profil |
#4 · Zasláno: 23. 8. 2007, 22:45:44
Ne ne, v tom to není, ono to jde, jen se to nedoporučuje. viz http://erik.eae.net/archives/2005/06/06/22.13.54 nebo http://log.under-construction.cz/?p=19
Mnohem větší problém tvého kódu je, ale to použití eval. Nejedná se o problém ve funkčnosti, ale spíše v principu a v zásadách dobrého programátora. Používání eval, a jeho ekvivalentů, tedy new Function, setInterval a setTimeout je velké zlo (z anglického eval is evil). Psát jakýkoliv kód jako řetězec a pak ho spouštět vyhodnocením je velmi nebezpečné. Můžeš si tím snadno způsobit běhové chyby, které se velmi těžko hledají. Přitom je to zbytečné. |
||
fos4 Profil |
#5 · Zasláno: 23. 8. 2007, 23:19:11
to co jsem napsal neni uplne a neni to ani konecne, potreboval bych vedet pro to nesezere IE ale ff a op jo
|
||
ah01 Profil |
#6 · Zasláno: 24. 8. 2007, 01:15:52
Já doufal, že tě od toho odradím nějak jednoduše. Problém je v tom že u IE nejde objekt HTMLElement pomocí jeho prototype rozšířit. Je to jedna z mnoha chyb IE. Tím se tvůj záměr trochýtek komplikuje.
Připravil jsem ti tedy malou ukázku jak to zařídit. Na podobném principu funguje třeba Prototype Framework. Mrkni na http://jslab.net/pub/jpw/sf/index.html a pak na kód |
||
fos4 Profil |
#7 · Zasláno: 24. 8. 2007, 11:08:20
ah01
moc dekuji tohle jsem presne potreboval vedet, pomohlo by to konecne vyresit vetsinu problemu v IE.. |
||
fos4 Profil |
#8 · Zasláno: 24. 8. 2007, 11:32:39
jeste jednou dikec .p
|
||
Časová prodleva: 17 let
|
0