« 1 2 »
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
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
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
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
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
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
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
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
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
Kcko:
ok, nechám to tak jak to mám..
Chamurappi
Profil
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
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
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
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
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
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
_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
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
_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
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
quatzael:
jak myslíš "pomocí textového řetězce"??
Že vo výraze window[objekt][metoda]()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
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
Joker:
9. a 10. riadok v [#24] vyzerá pochybne - funkcia funkce nemá ako zistiť, že metoda je nejako spojená s premennou prvek.
Joker
Profil
[#25] _es:
Jo, to je pravda, že tenhle příklad jsem asi úplně nedomyslel.
quatzael
Profil
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
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
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");
…a mám javascriptový* objekt

* 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>
Atribut data-typ je čistě jako příklad, ať můžeme ukázat nějaké rozdílné chování. Při kliknutí na položku se vyvolá funkce zpracujKlik a jako argument jí položka předá sama sebe (this = aktuální objekt).
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]();
  }
}
« 1 2 »

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