Autor | Zpráva | ||
---|---|---|---|
quatzael Profil |
Potřebuju volat metodu objektu i objekt samotný pomocí proměnné.
Ten objekt mi už někdo poradil, ale nevím jak použít proměnnou pro volání metody.. mělo by to být něco takového: var objekt = 'nazevobjektu'; var metoda = 'nazevmetody'; window.[objekt].metoda(); ale nefunguje to.. už jsem na to přišel.. má to být: window.[objekt][metoda](); |
||
Radek9 Profil |
#2 · Zasláno: 8. 12. 2012, 10:17:55
quatzael:
Bez té tečky. Tohle je ale vyloženě prasárna, proč prostě v té proměnné nemůžeš mít přímo referenci na ten objekt? |
||
quatzael Profil |
#3 · Zasláno: 8. 12. 2012, 10:34:50
Radek9:
ta tečka mi tam ulítla.. ve svým kódu jsem ji neměl.. „Tohle je ale vyloženě prasárna, proč prostě v té proměnné nemůžeš mít přímo referenci na ten objekt?“ tohle nechápu.. jak myslíš, že by to mělo vypadat..?? |
||
1Pupik1989 Profil |
#4 · Zasláno: 8. 12. 2012, 10:34:55
Já si dávám metodu do objektu, pro mě to tedy smysl mělo.
Volal jsem třeba Quest[Q01][part1](); uvnitř methody. |
||
Radek9 Profil |
#5 · Zasláno: 8. 12. 2012, 10:47:59
quatzael:
var objekt = nějakáFunkceKteráVrátíObjekt(); var metoda = "názevMetody"; objekt[metoda](); // Případně, jestli ta metoda bude vždy stejná: objekt.názevMetody(); 1Pupik1989: To by se taky podle mě dalo napsat lépe. Ale aspoň nehmyzíš globální prostor. |
||
quatzael Profil |
#6 · Zasláno: 8. 12. 2012, 11:25:12
Radek9:
no nevím jak myslíš tohle: var objekt = nějakáFunkceKteráVrátíObjekt();
to musím ještě vytvořit funkci, která mi bude vracet objekt?? jak to mám udělat?? jako return?? nic takovýho mi nefunguje.. to bych stejně nakonec dospěl k něčemu jako je tohle: window[objekt][metoda](); , jen s tím rozdílem, že to bude vyjádřený přes proměnný..
|
||
Radek9 Profil |
#7 · Zasláno: 8. 12. 2012, 11:49:14
quatzael:
Můžeš popsat ten konkrétní problém? Tyhlety přehnaně obecný ukázky jsou k ničemu. Nemusíš tvořit funkci, ale přijde mi zbytečný ten objekt získávat přes jméno proměnné, ve které je uložen. |
||
quatzael Profil |
#8 · Zasláno: 8. 12. 2012, 13:10:57
Radek9:
no prostě mám několik prakticky podobných obalových elementů, který se liší jen v tom, že nesou jiné informace a hodnoty. A pro každej element mám jinej objekt, a protože ty obalový elementy mají v sobě zase další elementy, tak potřebuju, aby se po kliknutí na ten jeden určitý podelement spustila metoda, která patří k tomuto podelemetu a spadá pod ten určitý objekt. Prostě potřebuju identifikovat konkrétní obalový element - jako objekt a podobalový elelement - jako metodu.. vymyslel jsem to tak, že bych použil pro název objektu id obalového elementu a pro název metody text z nějakého elementu přidruženému k patřičnému podelementu. takže to mám teď takhle nějak: var objekt = $(this).closest(".obal-class").attr("id"); var metoda = $(this).closest(".podelement-class").find(".info-class").text(); window[objekt][metoda](); funguje to tak nevím jak to udělat líp, aby to nebyla taková "prasárna".. |
||
Kcko Profil |
#9 · Zasláno: 8. 12. 2012, 13:12:34
quatzael:
Je to naprosto normální způsob zápisu. Tento styl je dynamické skládání, popisoval to ve svých tutoriálech i velmi schopný člověk v JS (Jeffrey Way), stejně tak Carl Swedberg autor jQuery. Používám to taky, pokud je to potřeba. |
||
quatzael Profil |
#10 · Zasláno: 8. 12. 2012, 17:52:01
Kcko:
ok, nechám to tak jak to mám.. |
||
Chamurappi Profil |
#11 · Zasláno: 9. 12. 2012, 00:03:22
Reaguji na quatzaela:
Je to prasárna, protože lovíš věci podle názvu v globálním kontextu. To je dost nenormální a docela pochybuji, že tohle doporučují autoři jQuery. Jinak je procházení struktur přes řetězce v pořádku. |
||
Kcko Profil |
#12 · Zasláno: 9. 12. 2012, 00:55:39
Chamurappi:
Kniha - Jquery kuchařka. Ale trošku jsem mystifikoval, nenabádají k lovení věcí v globálním kontextu, ale o možnosti dynamicky skládat objekty resp "Jinak je procházení struktur přes řetězce v pořádku" => to jsem měl namysli, ale špatně jsem se vyjádřil. |
||
quatzael Profil |
#13 · Zasláno: 9. 12. 2012, 10:02:59
no moc to teda opět nechápu, co je na tom teda konkrétně prasárna??
tohle? var objekt = $(this).closest(".obal-class").attr("id"); var metoda = $(this).closest(".podelement-class").find(".info-class").text(); nebo tohle? window[objekt][metoda](); nebo skutečnost, že to mám zkombinovaný.. |
||
Radek9 Profil |
#14 · Zasláno: 9. 12. 2012, 11:16:11
quatzael:
Ty máš v globálním prostoru několik názvů, které si bereš podle ID na tom prvku? To je docela hnus. Co je v tom výsledném objektu? |
||
quatzael Profil |
#15 · Zasláno: 9. 12. 2012, 16:12:11
já žádný jmenný globální prostory nepoužívám.. ani moc nevím jak fungujou..
prostě mám strukturu několika podobných elementů, který se od sebe liší hodnotami, které jsou v jejich obsahu. A protože hodně funkcí mají společných, tak jsem se snažil udělat ty funkce v javascriptu obecně a jenom to co mají rozdílné by se řešilo těmi objekty.. Kdybych dělal funkci čistě pro každej ten element zvlášť, tak mám kód asi stokrát delší, a bylo by to šílený... ale asi to stejně udělám trochu jinak.. ne kvůli tomu co mi tady radíte nahoře, ale aby to graficky bylo trochu šikovněji a poutavěji zpracovaný.. tak uvidím k čemu se dopracuju, ale stejně to budu muset nakonec řešit podobně jako teď.. |
||
_es Profil |
#16 · Zasláno: 10. 12. 2012, 10:26:02
quatzael:
„stejně nakonec dospěl k něčemu jako je tohle: window[objekt][metoda]()“ Prečo pristupuješ k objektom a metódam cez textové reťazce? Prečo nie „normálne“ objekt.metóda() ?
|
||
quatzael Profil |
#17 · Zasláno: 10. 12. 2012, 12:10:15
_es:
no protože potřebuju, aby objekt i metoda byly vyjádřeny proměnnými.. jinak bych musel pro každej element zvlášť funkci a kód by byl asi stokrát delší.. |
||
_es Profil |
#18 · Zasláno: 10. 12. 2012, 12:24:29
quatzael:
„no protože potřebuju, aby objekt i metoda byly vyjádřeny proměnnými.“ Prečo? Z akého dôvodu pomocou textového reťazca? Prečo nie „normálne“ do premennej priradiť objekt? Pripadá mi, že si sa nedostatočne naučil základy JS a vytváraš preto pochybné kódy. „jinak bych musel pro každej element zvlášť funkci a kód by byl asi stokrát delší.“ Čo to je za nezmysel? Do funkcie predsa môžeš predať hocičo ( funkcia(argument) ). Alebo si sa ešte nedostal k prototypom v JS?
|
||
quatzael Profil |
#19 · Zasláno: 10. 12. 2012, 13:12:08 · Upravil/a: quatzael
_es:
nevím jak to jednoduše vysvětlit.. prostě mám asi 100 podobných obalových elementů, v nich je složitá struktura, ale je tam asi jen 10 podelementů, které nabývají různých hodnot (tzn. mají tam někde ještě podelement, ve kterém je hodnota jako text), počet těch obalových elementů a hodnoty v těch podelementech se mění v závislosti ještě na úplně jiné volbě úplně z jiných elementů... A protože všechny tyto podelementy se asi z 60% chovají po kliknutí obdobně (vykoná se hafo funkcí - rozevře se nějaký podelement, zobrazí se něco, atd..) - všechno v rámci obalového elementu a mezi tím jsou i věci, u kterých záleží o jaký konkrétně element jde a jaká je "hodnota" tohoto podelementu. Takže potřebuju mít část skriptu napsanou obecně, a tu část, která je specifická jen pro daný element vyřešit objekty.. „Prečo? Z akého dôvodu pomocou textového reťazca? Prečo nie ‚normálne‘ do premennej priradiť objekt? Pripadá mi, že si sa nedostatočne naučil základy JS a vytváraš preto pochybné kódy.“ jak myslíš "pomocí textového řetězce"?? nerozumím co myslíš jako "normálně".. „Čo to je za nezmysel? Do funkcie predsa môžeš predať hocičo (funkcia(argument)). Alebo si sa ešte nedostal k prototypom v JS?“ argumenty ve funkci mám snad zvládnutý, plně je využívám.. nevím jestli v té souvislosti existuje ještě něco bych neznal... _es: ještě abych to upřesnil: prostě potřebuju volat metody objektů, přímo z těch funkcí, který jsou napsány obecně pro každý podelement, protože ta funkce teprve vyhodnotí, kterou metodu má přesně volat.. |
||
Joker Profil |
#20 · Zasláno: 10. 12. 2012, 14:15:51
quatzael:
„argumenty ve funkci mám snad zvládnutý, plně je využívám.. nevím jestli v té souvislosti existuje ještě něco bych neznal...“ To moc nevysvětluje. Respektive pořád nechápu, v čem je problém s tím, co _es radí: Dát objekt do funkce jako argument a používat ho přímo. |
||
_es Profil |
#21 · Zasláno: 10. 12. 2012, 14:23:04
quatzael:
„jak myslíš "pomocí textového řetězce"??“ Že vo výraze window[objekt][metoda]() sú objekt a metoda premenné obsahujúce textové reťazce, no výraze objekt.metóda() žiadne textové reťazce nemáš.
|
||
quatzael Profil |
Joker:
„Dát objekt do funkce jako argument a používat ho přímo.“ no jako myslíš "používat ho přímo" nějak takhle? function funkce(objekt.metoda()) { ... } respektive volání funkce: funkce(objekt.metoda()); _es: „Že vo výraze window[objekt][metoda]() sú objekt a metoda premenné obsahujúce textové reťazce, no výraze objekt.metóda() žiadne textové reťazce nemáš.“ No ale právě jsem to vysvětloval, že to potřebuju udělat jako proměnný.. Jak mám tedy použít proměnnou jako název objektu a metody bez toho, abych použil textový řetězec..? |
||
_es Profil |
quatzael:
„Jak mám tedy použít proměnnou jako název objektu a metody bez toho, abych použil textový řetězec..?“ Nevysvetlil si, prečo chceš „použiť premennú ako názov objektu“. Aj tak to ide iba pri globálnych premenných či vlastnostiach. Máš predsa „normálny“ názov premennej - var x = hodnota; či x = ináHodnota; - jej názov je x - aký iný názov tam ešte chceš?
„no jako myslíš "používat ho přímo" nějak takhle?“ Nie, myslené bolo: funkciaNaNejakúPrácuSObjektom(premennáVKtorejJeObjekt) Možno ti trochu pomôže Časté potíže, zajímavosti a poučné debaty » Rozdíl mezi voláním funkce a funkcí, no radšej si zakúp/nájdi nejaký kvalitnejší výukový materiál o programovaní v JS. |
||
Joker Profil |
#24 · Zasláno: 11. 12. 2012, 10:52:39
quatzael:
„no jako myslíš "používat ho přímo" nějak takhle?“ No, ten příklad je špatně, ale teoreticky by teda šlo mít jako argument i tu metodu, ale já myslel tam dát prostě ten objekt: function funkce(objekt) { objekt.hide(); // volám nějaké metody objektu. V mém příkladu je to jQuery objekt, tak zavolám třeba hide() } var prvek = $("#nejakyPrvek"); // získám si ten objekt co chci funkce(prvek); Pravda, šlo by do funkce jako argument předat i funkci, to by se udělalo takhle: function funkce(jinaFunkce) { jinaFunkce(); // zavolám funkci z argumentu } var predanaFunkce = function() { alert("Ahoj!"); } funkce(predanaFunkce); // další způsob: var prvek = $("#nejakyprvek"); // získám jQuery objekt var metoda = prvek.hide // uložím si do proměnné nějakou jeho metodu- všimněte si, že ji nevolám, nejsou tam závorky funkce(metoda); // předám metodu jako argument funkce Další informace viz [#23] _es |
||
_es Profil |
#25 · Zasláno: 11. 12. 2012, 11:00:04
Joker:
9. a 10. riadok v [#24] vyzerá pochybne - funkcia funkce nemá ako zistiť, že metoda je nejako spojená s premennou prvek .
|
||
Joker Profil |
#26 · Zasláno: 11. 12. 2012, 11:08:17
[#25] _es:
Jo, to je pravda, že tenhle příklad jsem asi úplně nedomyslel. |
||
quatzael Profil |
#27 · Zasláno: 11. 12. 2012, 13:02:11 · Upravil/a: quatzael
Joker:
„// uložím si do proměnné nějakou jeho metodu- všimněte si, že ji nevolám, nejsou tam závorky“ já jsem si hlavně všiml, že tam není středník.. to je doufám chyba.. Joker: ještě, abychom si rozumněli, já opravdu potřebuju volat svý objekty a metody, který jsem si sám nadefinoval.. mě připadá, že se mi snažíš poradit jak volat "objekty" a "metody", který jsou už v js předdefinovaný... Já řeším vlastní objekty a metody, klasický OOP.. nevyznám se moc v terminologii, co javascript všechno považuje za objekt.. _es: „Máš predsa ‚normálny‘ názov premennej - var x = hodnota; či x = ináHodnota; - jej názov je x - aký iný názov tam ešte chceš?“ já jsem ale nemyslel název promměný, ale právě tu hodnotu. Ta přece musí být typ řetězce, ne?? To, který objekt a kterou metodu bude ta moje funkce volat pozná jen podle obsahu z HTML (id nebo přímo text), a když něco tahám z HTML tak je to přece vždycky primárně řetězec.. Přece nenatáhnu z HTML javascriptovej objekt..?? |
||
_es Profil |
#28 · Zasláno: 11. 12. 2012, 13:20:23
quatzael:
„mě připadá, že se mi snažíš poradit jak volat "objekty" a "metody", který jsou už v js předdefinovaný...“ Nie, snažíme sa ti poradiť, ako ich použiť správne. „Já řeším vlastní objekty a metody, klasický OOP..“ Radšej sa začni učiť JS od základov. Neovládaš úplné základy, máš v tom zmätok. „Klasický OOP“ neznamená „čarovanie“ s textovými reťazcami. |
||
quatzael Profil |
#29 · Zasláno: 11. 12. 2012, 13:56:58
možná si úplně nerozumíme...
zkusím úplně obecně na hypotetickým příkladu. Představte si, že mám nějakou takovouhle strukturu. Elementy jsou pojmenovány černě. Obecná struktura je taková, že je tam několik obalů, každý obal má několik itemů, a každý item několik subitemů. Obalových elementů je tam asi třicet, ale může být zobrazeno třeba jen pět. V ukázce mám dva. Typů itemů je cca 10 (existuje deset typů - pevně dané), může se zobrazit všech deset nebo žádný.. subitemy jsou opět jedinečné. Každý subitem u konkrétního obalu má svůj specifický název. To jak bude ta struktura konkrétně vypadat závisí na předchozím kroku, tzn. vyplivne to php, variant jak to celé může vypadat je opravdu hafo.. Já potřebuju, abych po každém kliku na konkrétní subitem poznal, ve kterém itemu a obalu se nachází a jakou nese hodnotu.. Když kliknu na nějaký ten subitem tak se ale vykoná spousta funkcí, které jsou shodné pro všechny subitemy bez ohledu na to, ve kterém obalu jsou, a na základě výsledku těchto funkcí se má volat konkrétní metoda.. Ty hodnoty subitemů opět můžou být různé, záleží co vyplivne php.. No nevím jestli jsem to vysvětlil dostatečně.. Celé je to mnohem složitější, tohle je jen extrémně stručný obrys.. tak zkuste napsat jaké je podle vás nejvhodnější obecné řešení - pro to získávání těch hodnot.. Jenom zdůrazňuju, že těch subitemů čili i těch hodnot je tam dohromady několik stovek, takže mít pro každej nějakou proměnnou je šílený.. maximálně by se to dalo asi nějak vyřešit přes více rozměrný pole... |
||
Joker Profil |
quatzael:
„já jsem si hlavně všiml, že tam není středník.. to je doufám chyba..“ Ano, to je samozřejmě chyba. „já opravdu potřebuju volat svý objekty a metody, který jsem si sám nadefinoval.. mě připadá, že se mi snažíš poradit jak volat "objekty" a "metody", který jsou už v js předdefinovaný“ Jakto? V ukázce jsem použil jQuery objekt, tedy „vlastní“ objekt, který není předdefinovaný v JS (jestli ten objekt napíšu sám anebo ho napíše někdo jiný je snad jedno). V každém případě ale i ten jQuery objekt je tam čistě jako příklad a nějaký jiný objekt by fungoval obdobně. „když něco tahám z HTML tak je to přece vždycky primárně řetězec.. Přece nenatáhnu z HTML javascriptovej objekt..??“ Proč ne? var prvek = document.getElementById("prvek"); * Pokud tedy prvek existuje a když se nebudeme vrtat v terminologii DOM vs Javascript. Doplnění: [#29] quatzael: „mít pro každej nějakou proměnnou je šílený“ To rozhodně. Jak vidím, pořád nechápete to předání objektu do funkce a možná ještě u události jak rozlišit odkud nastala, protože zbytek by měl být vcelku přímočarý. Tak příklad: <li id="subItem1" data-typ="foo" onclick="zpracujKlik(this)">První položka</li> <li id="subItem2" data-typ="foo" onclick="zpracujKlik(this)">Druhá položka</li> <li id="subItem3" data-typ="bar" onclick="zpracujKlik(this)">Třetí položka</li> Nemusí předávat zrovna this, mohla by předat třeba svoje IDčko a funkce by si pak objekt získala vevnitř, případně by mohla předat něco jiného, kdyby to bylo k něčemu dobré. V našem příkladu se bude posílat objekt dané položky. A teď Javascript: // jako příklad si definuji objekt mujObjekt, který má metody foo a bar var mujObjekt = { foo : function() { alert("Vyvolala se metoda foo!"); }, bar : function() { alert("Vyvolala se metoda bar!"); } } // a teď funkce zpracujKlik: function zpracujKlik(prvek) { // Jako argument dostaneme objekt daného prvku var metoda = prvek.getAttribute("data-typ"); // získám z prvku atribut data-typ if(typeof(mujObjekt[metoda]) === "function") { // jestliže mujObjekt má metodu stejného názvu jako atribut data-typ, vyvolá se metoda mujObjekt[metoda](); } } |
||
Téma pokračuje na další straně.
|
0