Autor Zpráva
quatzael
Profil
Potřeboval bych, abych si mohl konkrétní element uložit jako proměnnou, bez ohledu na jeho následující stav.
Konkrétně, aby šlo něco takového:

var element=$(".neco:visible");
     element.hide();
     element.show();

Potřebuju, aby se potom element opět zobrazil.
pcmanik
Profil
quatzael:
No veď ro robí presne to čo chceš, uloží to všetko čo je viditelné s triedou neco do premennej s názvom element.

A ak chceš konkrétny element z tej kolekcie, tak na to je metóda jQuery .eq()

Tu budu zrejme iný problém, ty pravdepodobne chceš toto:
element.hide(function() {
    element.show();
});
quatzael
Profil
pcmanik:
aha, ale problém je asi v tom, že nemám globální proměnnou a používám jí v různých fukcích:

$("#id").hover(function(){
     var element=$(".neco:visible");
     if (!$("#id").is(":focus"))
     {
     element.hide();
     myFunction();
     }
     },
     function(){
     if (!$("#id").is(":focus"))
     {
     $("#different-id").hide();
     element.show();
     }
    });  
joe
Profil
quatzael:
Ty ale deklaruješ proměnnou element v jedné funkci a chceš ji získat ve druhé. To nejde. Deklaruj ji před voláním funkce hover.

 var element=$(".neco:visible");
$("#id").hover(function(){ ...
quatzael
Profil
joe:
to jsem zkusil a taky to nějak nefunguje..
Já hlavně potřebuju znát aktuální stav, před voláním funkce .hover()... Je to tak, že ta proměnná element se neustále aktualizuje, když je ve funkci ready()??
Pokud se ta proměnná načte jenom jednou po načtení stránky, tak mi je to k ničemu..
pcmanik
Profil
quatzael:
Premenná sa sama neaktualizuje.
Povedz nám radšej, čo chceš dosiahnuť.
joe
Profil
quatzael:
Asi myslíš DOM ready, to proběhne jednou, pokud je objektový model dokumentu připravený (proto se to tak i jmenuje :-)).

to jsem zkusil a taky to nějak nefunguje..
Co třeba napsat jak to nefunguje?

Možná by bylo lepší, kdybys napsal, co potřebuješ udělat.

A vhodné by bylo, uložit si do proměnné i výsledek $("#id") a zvolit lepší identifikátor v HTML, id není moc originální :-)
quatzael
Profil
stručně:
vedle inputů ve formuláři mám info ikonky a skryté bubliny s nápovědou. Po najetí myší na tu ikonku (funkce hover) se má zobrazit bublina s nápovědou. Ale bublina s nápovědou se má zobrazit také vždy když je input focused. A v tom případě když najedu myší na info ikonku u jínýho inputu se má aktuální bublina u focused inputu skrýt a objevit se má ta, která je vedle info ikonky, na které mám zrovna myš. Až sjedu myší opět pryč, má se znovu objevit bublina u inputu, kterej je momentálně focused..


joe:
uložit si do proměnné i výsledek $("#id")
jakej výsledek??

a zvolit lepší identifikátor v HTML, id není moc originální :-)
samozřejmě mám svoje totálně originální názvy identifikátorů, ale ty tady nechci psát do diskuze, protože jednak by ten příklad nebyl tolik přehlednej a druhej fakt je, že byz toho hned šlo poznat co dělám.. a to já ne echci..:o)


už jsem to vyřešil..


proměnnou element jsem nastavil jako globální..

zkoušel jsem to i prve, ale nechal jsem tam var v tý funkci, takže se to chovalo zase jako lokální proměnná..

správně je to tedy:

var element;
$(document).ready(function(){
$("#id").hover(function(){
     element=$(".neco:visible");
     if (!$("#id").is(":focus"))
     {
     element.hide();
     myFunction();
     }
     },
     function(){
     if (!$("#id").is(":focus"))
     {
     $("#different-id").hide();
     element.show();
     }
    });
    });  
joe
Profil
quatzael:
jakej výsledek??
$ je funkce. Tudíž výsledek volání funkce $("#id") si ulož do proměnné, ať tu funkci nevoláš zbytečně při každém najetí a odjetí na element, je to zbytečné.

K problému. Stačí řešit problém (zobrazení bubliny) jen v jednom případě událostí (najetí/odjetí na ikonku nápovědy) a pak si je v dalších událostech jen volat (například pomocí trigger()). V příkladu to ale zjednoduším, do funkcí si to snad zvládneš upravit sám.


var input = $("#id"),
      bublina = $("#id-bublina"),
      ikonka = $("#id-ikonka");

ikonka.hover(function() {
     bublina.show();
},
function () {
    bublina.hide();
}
);

input.focus(function () {
    bublina.show();
});

input.blur(function () {
    bublina.hide();
});
quatzael
Profil
joe:
no moc to nechápu jak to myslíš, je možný, že jsi úplně nepochopil co mám namysli.. každopádně mě to moje řešení funguje..

já tam mám těch inputů pod sebou několik, a to zobrazení tý bubliny řeším právě tou funkcí myFunction();

každá bublina se chová jinak, takže těch funkcí myFunction() mám taky víc..
joe
Profil
quatzael:
Proč by se každá bublina měla chovat jinak? Bublinu přece jen zobrazuješ nebo schováváš. Já jsem tvůj problém pochopil velmi dobře.
quatzael
Profil
joe:
mám tam v každý bublině ještě specifický animace, takže každá se chová trochu jinak..
preca1
Profil
quatzael:
To "řešení" s globální proměnnou neni dobrý. Všechny ostatní části kódu maj teď k týhle proměnný přístup a můžou jí měnit. Pokud si stáhneš špatně napsanej plugin, kterej taky používá globální proměnnou element, tak máš problém. Lepší by bylo mít tu funkcionalitu zapouzdřenou v nějakym modulu ve svym jmennym prostoru.

Jako lepší řešení se mi zdá: při aktivaci (focus) inputu zobrazíš jeho bublinu a odkaz na ní si uložíš.
Při najetí na info ikonu schováš zrovna zobrazenou bublinu (jestli nějaká je) a zobrazíš tu, která se má zobrazit.
Při odjetí z info ikonky schováš bublinu přiřazenou k tý info ikoně a zobrazíš tu, kterou máš uloženou (bublina zobrazená po aktivaci inputu).
Při zneaktivnění (blur) inputu smažeš odkaz na zrovna zobrazenou ikonu.
Výslednej kód mi přijde čitelnější, než v [#8] (aspoň teda v mý hlavě).

Můžu se zeptat, jak se menujou ty funkce, který tu prezentuješ jako myFunction a pár implementací? Jestli sem tě pochopil dobře, tak budeš mít funkce jako hideToolTipSlowly a hideToolTipToTheLeft apod. a jejich implementace se bude lišit akorát v použité animaci. To by se dalo řešit nějakym konfigurákem/parametrem. A je vůbec potřeba mít u každý bubliny jinej efekt?

[#9] joe
Neni vyvolávání události, která se nestala, jen aby se zavolal kód, kterej chci, trochu hack? Co když do obsluhy události přidá další kód?
joe
Profil
preca1:
Dá se říct, že je :-) Pokud to je v rámci jednoho modulu, jako to chce quatzael tady, určitě by bylo lepší si na to vytvořit funkce a ty v příslušných událostech volat, ale taky nepředpokládám, že se bude dít i jiná akce na bublině při najetí a odjetí kurzoru, i když samozřejmě se může stát, že nějaký nešika nám na bublinu navěsí nějakou nechtěnou událost, i pak by to šlo řešit v jQuery tuším pomocí pojmenování událostí.

mám tam v každý bublině ještě specifický animace, takže každá se chová trochu jinak..
Každá se chová možná jinak, ale primární úkol je bublinu zobrazit nebo schovat. Pokud chceš u každé definovat jinou animaci, můžeš si ji dát do atributu, jak už ti preca1 napsal. Třeba <div clas="bubble" data-animation="fade"></div>. Můžeš si tak nastavit i pozici zobrazení bubliny (nahoře, vpravo, dole, vlevo) a nebo to detekovat automaticky v té dané fci.

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