Autor Zpráva
quatzael
Profil
Je nějak možné volat funkci pomocí proměnné?

Něco jako:

var funkce = "nazevfunkce";
[funkce]();
Chamurappi
Profil
Reaguji na quatzaela:
Už ses na to jednou ptal, k čemu tuhle čuňárnu potřebuješ?
quatzael
Profil
Chamurappi:
Já vím, že jsem se ptal. Ale to bylo na volání objektu a metody, což mi tady s tou funkcí nějak nefunguje..

tahle čuňárna úzce souvisí s tímhle problémem: Jak uložit element do proměnné?

Až na to, že bych chtěl, aby se znovu zobrazená bublina (po přejetí myší pryč z info ikonky u jiného inputu) opět vykreslila druhou funkcí myFunction();, který je právě specifická pro každý input..


zkrátka potřebuju si uložit do proměnné název funkce.. jde to nějak??


místo toho element.show(); tam chci znovu rozběhnout funkci, která ten element zobrazí a ještě k tomu přidá nějaký svoje specifický animace..
Chamurappi
Profil
Reaguji na quatzaela:
zkrátka potřebuju si uložit do proměnné název funkce..
Nepotřebuješ. Nevím, co přesně potřebuješ, ale tohle skoro určitě nepotřebuješ.
quatzael
Profil
a to mi nemůžeš prosím poradit jak na to??

nebo mi plís vysvětli v čem je to tak hrozný, že se to podle Tebe nesmí za žádnou cenu nikde na webu objevit?
Jan Tvrdík
Profil
quatzael:
Ulož si do té proměnné místo názvu funkce tu samotnou funkci.
Joker
Profil
quatzael:
Ale to bylo na volání objektu a metody, což mi tady s tou funkcí nějak nefunguje..
Samostatné funkce v JS jsou ve skutečnosti taky metody objektu.

Nicméně i já zastávám názor, že když otázka naznačuje, že tazatel se při řešení nějakého problému vydal úplně špatnou cestou a teď naráží na problémy, je správné odkrýt a řešit ten původní problém, ne ho posunout o krok dál na té špatné cestě.
Proto zatím nebudu psát konkrétní kód.

nebo mi plís vysvětli v čem je to tak hrozný, že se to podle Tebe nesmí za žádnou cenu nikde na webu objevit?
Chamurappi spíš říká, že to je horší řešení v situaci, kdy skoro jistě existuje i lepší řešení. Kdybychom měli bližší popis problému, uměli bychom najít i to lepší řešení.

Ale špatné to je proto, že:
• Vzniká nepřehledný kód (z volání nebude zřejmé, jaká funkce se vlastně).
• Přeruší to jasnou vazbu volání na konkrétní funkci, kdybych třeba v IDE chtěl z volání zjistit definici té funkce, mám smůlu. Ještě horší je, že tahle konstrukce by nejspíš zůstala skrytá před dohledáním výskytů té funkce v kódu.
• Změnou hodnoty té proměnné se dá ovlivnit volaná funkce, čímž už vznikne úplný chaos.
• Může to být zdroj podivných chyb.
• V JS jsou ukládat do proměnných samotné funkce, tak proč používat tohle?
quatzael
Profil
Joker:
Já už jsem to vysvětloval v tom druhým vlákně.

Mám formulář s inputy a vedle každýho inputu je ikonka pro zobrazení nápovědy v bublině. Každý input má tu nápovědu v bublině trochu jinak, takže zobrazení té nápovědy je řešeno funkcemi, které se u každé bubliny liší. Funguje to tak, že když uživatel najede myší na tuto ikonku, spustí se funkce, která zobrazí vedlé té konkrétní ikonky bublinu s nápovědou. To má fungovat jen jako hover. Takže když uživatel sjede myší pryč, tak bublina opět zmizí.. Nicméně bublina má být zobrazena také vždy když je daný input focused s jedinou vyjímkou, kdy bublina zmízí po najetí myší na ikonku pro zobrazení bubliny u jiného inputu a má se opět zobrazit když uživatel sjede myší z ikonky pryč, protože input zůstává stále focused.

Pro každé zobrazení bubliny potřebuju spustit funkci, která zobrazuje danou konkrétní bublinu. Bubliny se nespouštějí jednou univerzální funkcí, ale každá má svou specifickou..

Proto potřebuju si název funkce uložit do globální proměnné při události, kdy se input stane focused a pak tuto funkci spustit, když se myší sjede pryč z jiné ikonky (druhá funkce v hover)..


Joker:
Vzniká nepřehledný kód (z volání nebude zřejmé, jaká funkce se vlastně)
Nepřehledný pro koho?? Ten kód vytvářím pro sebe, není to dělané, aby se v tom primárně měl hned každý cizí člověk vyznat..

kdybych třeba v IDE chtěl z volání zjistit definici té funkce, mám smůlu.
já IDE nepoužívám. Dělám kód dostatečně srozumitelný, abych se v něm vyznal, takže tohle nepotřebuju. Navíc nevím o nějakém šikovném a praktickém.

Změnou hodnoty té proměnné se dá ovlivnit volaná funkce, čímž už vznikne úplný chaos.
O to celé jde!!! Já potřebuju měnit hodnotu té proměnné, aby se mi volala vždy funkce, která zobrazuje bublinu u aktuálně focusovanýho inputu!!!

Může to být zdroj podivných chyb.
Nevím co by tam mělo vznikat za chyby, když se hodnota mění akorát při události focus a to jednoznačně. Tedy přiřadí se k proměnné přímo string s názvem funkce, ne hodnota jiné proměnné..

V JS jsou ukládat do proměnných samotné funkce, tak proč používat tohle?
Tohle přece ani trochu neřeší můj problém..


Už jsem na to přiše, má to být:

var funkce = "nazevfunkce";
window[funkce]();

Já jsem tam zase psal tečku za window a nefungovalo mi to..
Jan Tvrdík
Profil
quatzael:
Proto potřebuju si název funkce uložit do globální proměnné při události
Neukládej název té funkce, ale tu funkci samotnou.

// uložení
var funkce = window.nazevFunkce;

// spuštění
funkce();
quatzael
Profil
Jan Tvrdík:
Máš pravdu, takhle by to mělo jít taky.. Díky!!
_es
Profil
quatzael, Jan Tvrdík:
Ale prečo už nie rovno nazevFunkce();? A prečo je tá funkcia globálna?
aDAm
Profil
Proč tak složitě? Pokud to má dělat jen ty bubliny tak si nad ty ikony pověsím eventy co při hoveru budou dělat akci zobrazení konkrétní bubliny a skrytí ostatních a na focus inputu se hodí taky akce co provede zobrazení či skrytí bublin. Proč nějaké mixování funkcí, volání je z globálu atd???
quatzael
Profil
aDAm:
jde o to, aby se ta bublina u focusovanýho inputu po sjetí myši z ikonky u jinýho inputu znovu zobrazila, včetně vykreslení, takže je nutné volat stejnou funkci, která byla naposledy volána při event focus..
aDAm
Profil
quatzael:
ok sry, ty vlasně nemáš rád frameworky, chtěl sem ti poradit např jquery a udělat plugin který pověsíš nad vybraný element a pak jednoduše trigovat eventy, ale to te určitě nezajímá ;)
quatzael
Profil
aDAm:
já jsem neřekl, že nemám rád FW, jQuery náhodou využívám hodně, i ty bubliny mám udělaný pomocí jQuery. Já už jsem to vyřešil, ale jestli Tě napadá lepší řešení, tak se klidně pochlub..
aDAm
Profil
quatzael:
jak jsem psal výše. Např. si na ten element co dělá bublinu pověsit plugin a při focusu či hoveru nad vybraným elementem volat metody co provedou zobrazení či skrytí. Neznám přesně tvůj kód jak to tam řešíš jak to voláš atd, ale řek bych že bindování eventů je jedna z cest kterou by se to dalo řešit.
1Pupik1989
Profil
Na to je ale přece zbytečné natahovat bůhvíjak velké JQuery ne? Vždyť všechny už jsou v základu javascriptu.
Joker
Profil
quatzael:
Nepřehledný pro koho?? Ten kód vytvářím pro sebe, není to dělané, aby se v tom primárně měl hned každý cizí člověk vyznat..
Po nějaké delší době je i můj vlastní starý kód skoro jako cizí.
Zjišťuju, že u kódu, kde jsem si kdysi dal záležet aby se v tom dalo vyznat, si pak po měsících/letech daleko méně nadávám, jak jsem to tehdy mohl tak blbě napsat :)
Dokonce mám někdy sám ze sebe dodatečně radost, když mi kód naopak vychází vstříc v pochopení, jak to funguje a proč to tak funguje.

O to celé jde!!! Já potřebuju měnit hodnotu té proměnné, aby se mi volala vždy funkce, která zobrazuje bublinu u aktuálně focusovanýho inputu!!!
Nevidím moc důvod, proč by zobrazování bubliny musela řešit u každého prvku jiná funkce, ale když vidím jak roste průměrný počet vykřičníků na větu, tak snad jen hodně štěstí s údržbou toho skriptu.

V JS jsou ukládat do proměnných samotné funkce, tak proč používat tohle?
Tohle přece ani trochu neřeší můj problém..
Jak se ukázalo v dalších příspěvcích, řeší.
Tori
Profil
quatzael:
Pro každé zobrazení bubliny potřebuju spustit funkci, která zobrazuje danou konkrétní bublinu. Bubliny se nespouštějí jednou univerzální funkcí, ale každá má svou specifickou..
A proč ne? Smyslem existence funkcí je to, aby se zabránilo opakování kódu, a naopak abyste ten kód, co už jednou napíšete, mohl použít znova. To, že funkce dělá jen a pouze jednu věc tomu napomáhá. Co když přidáte další input - budete dopisovat nějaké další funkce? Přijde mi jednodušší i přehlednější mít jednu funkci, která zobrazí bublinu, a předat jí nějaké pole/objekt s nastavením, jak konkrétně má tu bublinu vyfouknout.


Abych to upřesnila - nesnažím se vás (po marných pokusech lepších hlav) přesvědčit o správnosti jiného řešení. Ale ani pro pročtení obou souvisejících vláken jsem nikde nenašla žádné vaše zdůvodnění,
1. proč jste se rozhodl pro toto řešení, a
2. v čem má pro vás výhody oproti řešení navrhovanému všemi ostatními.
quatzael
Profil
Tori:
Vysvětloval jsem, že ty každá bublina se spouští svojí specifickou funkcí. Jsou specifické proto, že tam probíhají specifické, ne úplně triviální, animace, u každé bubliny jiné. Kdybych to za každou cenu chtěl udělat jednou univerzální funkcí, musel bych tam nasekat desítky parametrů, jednak coby hodnoty CSS a jednak pro podmínky, protože by se ta funkce musela větvit, aby se pro každou bublinu vytvořila animace, která pro ni patří. Navíc bych musel všechny tyhle proměnné mít jako globální, a při každém focusu na input, bych musel tyto proměnné nastavovat na konkrétní hodnotu, abych se potom mohla znovu spustit funkce se správnými parametry..

Potřebuju to pro cca 5 inputů na dvou formulářích, tak je pro mě daleko praktičtější si napsat dohromady deset specifických funkcí. A když budu potřebovat přidat nějakou animaci jenom do jedné bubliny a budu na to potřebovat další parametr, nebudu muset šahat do všech těch příkazů ke spuštění funkce a měnit tam u každý paramemtry..

Mě to teď funguje jak potřebuju, kdybych to měl předělávat, tak nad tím strávím několik hodin..
Tori
Profil
Ok, děkuju.

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: