Autor Zpráva
hal_sk
Profil
Zdravím.
Potreboval by som, aby sa rovnaká funkcia spustila pri spustení aspoň jednej z viacerých udalostí.
Dá sa to aj takto zapísať:
onchange="pocitaj()" onkeyup="pocitaj()" onclick="pocitaj()"

ale zaujímalo by ma či neni nejaké riešenie v štýle:
onchange OR onkeyup OR onclick = "pocitaj()"

Vďaka.
SwimX
Profil
hal_sk
cosi = getElementById('cosi');
with(cosi) onchange = onkeyup = .... = function(){

}
hal_sk
Profil
Takže tak. Dík.
ah01
Profil
SwimX
Prosím, nepoužívej with.
_es
Profil
ah01
V tomto prípade je jeho použitie vhodné, no často je použitie with nevhodné.
Hlavne to hrozí, ak sa má jednať o nejaké príkazy v cykle a pod.
Začiatočníci by ho radšej nemali používať.
SwimX
Profil
ah01
Prosím, nepoužívej with.
v tomto případě mi ho doporučil _es a myslím, že ví co dělá, takže ho použiju. Máš lepší řešení?
_es
Profil
SwimX
Náhradou môže byť napríklad:
cosi = getElementById('cosi');
cosi.onchange = cosi.onkeyup = .... = function(){
// nejaké príkazy
};

Výhodou this môže byť, že netreba vyrábať žiadnu premennú:
with(getElementById('cosi')) onchange = onkeyup = .... = function(){
// nejaké príkazy
};
SwimX
Profil
_es
j děkuji, já to použil jenom pro kontrolu právě zadávaných dat do inputu (pomocí regulláru) a tím jsem s js zas na dlouho skončil :))
ah01
Profil
_es, SwimX
Dovolím si nesouhlasit. with není nikdy vhodné použít. A to ani v případě že si myslíte, že víte co dělá.

Pokud jste si přečetli odkazovaný článek a nestačilo vám to, tak uvedu příklad z knihy JavaScript: The Good Parts stejného autora jako zmíněný článek.

Podívejte se na následující kód

with(obj){
  a = b;
}

který dělá přesně to samé jako

if (obj.a === undefined) {
    a = obj.b === undefined ? b : obj.b;
} else {
    obj.a = obj.b === undefined ? b : obj.b;
}

Takže ve výsledku jsou 4 možnosti, které mohou nastat.

a = b;
a = obj.b;
obj.a = b;
obj.a = obj.b;

Není možné po přečtení programu říci, která z těchto 4 možností bude použita. A může se to lišit při dalším spuštění programu nebo při opětovném volání tohoto kódu. Jde mi to, že po přečtení kódu takového programu nevím jistě, co se vlastně stane. Jak si můžu být vůbec jistý, že mnou naspaný program dělá to, co po něm chci?


Možná si řeknete, že tento příkaz je uměle vymyšlený, a do problémů se dostanu jen v případě složitého kódu s mnoho objekty a mnoho proměnnými. Takový kód jako je v tomto vlákně, je přeci úplně jasný a nemůže dojít k žádnému problému....

Pokud si to myslíte, tak se podívejte na následující ukázku. Je to ten samý kód jako uvádí _es, jen jsem k němu doplnil nějaké ty příkazy aby to vůbec něco dělalo.

var name = „Pavel“
with(getElementById('cosi')) onchange = onkeyup = .... = function(){
    name = „Petr“; // přejmenování
};

Co chceme je jasné, změnit hodnotu proměnné name. Podívejte se znovu na ten kód, zamyslete se, a pak si výsledek vyzkoušejte na ukázkové stránce. Opravdu se na ukázkovou stránku podívejte!

Těm co nechápou jak to, že to nefunguje, je již jasné, že je lepší se with vyhnout (aspoň v to doufám). A ti co okamžitě věděli, co se stane – ruku na srdce, opravdu si myslíte, že je with vhodné používat? Opravdu dovedete vždy a za všech okolností říci, jak daný kód bude fungovat?
_es
Profil
ah01
Mohol si už aj vysvetliť, v čom je rozdiel.
Podobné neistoty v kóde nastávajú aj pri vnorených funkciách, alebo pri volaní metód objektov.
Rovnako by globálnu premennú name nepremenoval pri priradení udalosti v atribúte v HTML.
Stačilo vysvetliť, že funkcia definovaná vo with nie je rovnaká, ako funkcia definovaná globálne.
Môže to byť nevýhodou a takisto sa to dá aj využiť.
Môžem aj chcieť pristupovať jednoducho k vlastnosti name alebo k iným vlastnostiam objektu.
A používať pre ukážku jednej (väčšinou) nedoporučovanej techniky inú nedoporučovanú, sa mi nezdá celkom dobré.
Pomenovať globálnu premennú name?
Čo keď sa iná časť skriptu spolieha na premenovanie okna pomocou name="nový názov okna"?
To by som mohol takisto pomenovať globálnu premennú arguments a ukázať na príklade, pri pokuse o prístup z nejakej funkcie k nej,
aké je používanie funkcií nevyspytateľné a teda nevhodné a je lepšie to nejako urobiť bez nich.
Príkaz with som poradil SwimXovi s priradením bez definície funkcie vo with bloku. Teda:
with(textarea) onchange = onclick = ondblclick = onmousedown = onmouseup = onkeypress = onkeydown = onkeyup = stisk;
Tak to je bezpečnejšie, aj som hneď SwimXa varoval pred nerozvážnym používaním.
Mimochodom aj z toho odkazu čo si dal, vedie odkaz na nejaké optimalizačné techniky, kde je niečo asi také, že:
"Zvyčajne je použitie with zlá myšlienka, no..."
Je to asi rovnaké, ako použitie príkazu goto v niektorých iných jazykoch, že je lepšie sa mu vyhnúť, no niekedy sa hodí.
Napríklad, ak by som mal v JavaScripte robiť nejakú matematickú aplikáciu, s častým používaním funkcií a konštánt objektu Math,
tak kľudne uzavriem celý kód do
with(Math){ /*celý kód */ }
,namiesto toho, aby som do kódu 1000 krát písal Math.
Doporučuje to aj dokumentácia, stačí v tomto kóde kliknúť na Math.
Chamurappi
Profil
Reaguji na ah01:
V názoru na oprávněnost existence „with“ se mimochodem s Crockfordem neshodne ani Eich.

Osobně „with“ nepoužívám hlavně proto, že mi do JavaScriptu vůbec „nepasuje“. Beru ho jako syntaktickou anomálii znepřehledňující kód, nevěřím mu a krom zmíněné nejednoznačnosti má problém i s kompatibilitou napříč prohlížeči.


Reaguji na _es:
Pomenovať globálnu premennú name? Čo keď sa iná časť skriptu spolieha na premenovanie okna pomocou name="nový názov okna"?
Globální proměnná „name“ je vlastností globálního objektu (tedy window), takže přejmenování okna je možné a v ukázkové stránce k němu i dochází.

To by som mohol takisto pomenovať globálnu premennú arguments
K problému, že si něco globálního lokálně nechtěně překryješ, samozřejmě může dojít a je zapotřebí na to dávat pozor. Každý „with“ ti ovšem vytváří další podobnou rizikovou situaci, což dle mého názoru jeho přednosti zdaleka nevyvažují.

with(textarea) onchange = onclick = ondblclick = onmousedown = onmouseup = onkeypress = onkeydown = onkeyup = stisk;
Pokud nějaký jiný skript na téže stránce přidal metodu nebo vlastnost jménem „stisk“ k objektu textarea, jsi v pytli. Řekl bych, že toto mé „pokud“ se na rozdíl od řady jiných hypotetických scénářů nevylučuje s příčetností programátora.

<mimo-téma>
  Tvůj styl psaní příspěvků „jedna věta = jeden až dva řádky“ mi připadá nepřehledný, na oddělování myšlenek se běžně používají odstavce.
</mimo-téma>
_es
Profil
Chamurappi
má problém i s kompatibilitou napříč prohlížeči.

Tá nekompatibilita je jedna a dá sa napraviť definíciou funkcie literálom.

Ja som predsa nedoporučoval používať with vo veľkej miere, len tam, kde sa to môže vyplatiť, napríklad úsporou veľkosti kódu, alebo v niektorých prípadoch jeho zrýchlením. Napríklad:
with(textarea)onchange=onclick=ondblclick=onmousedown=onmouseup=onkeypress=onkeydown=onkeyup=function(){alert(value);};
Inými spôsobmi ten kód nebude taký krátky. Prehľadný je myslím dosť.

No aj keď ho niekto nechce používať, je dobré vedieť jeho dôsledky, ak treba napríklad upraviť kód po niekom inom.

Tvůj styl psaní příspěvků ... mi připadá nepřehledný,
Pokúsim sa to zlepšiť, naozaj to vyzerá neprehľadne.
_es
Profil
Chamurappi:
Globální proměnná ‚name‘ je vlastností globálního objektu (tedy window), takže přejmenování okna je možné a v ukázkové stránce k němu i dochází.
To nie je také isté a dokonca som zistil, že rôzne verzie rovnakého prehliadača menia v tomto svoje správanie.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0