Autor | Zpráva | ||
---|---|---|---|
ALLSSA Profil |
Dobrý den,
s jQuery začínám a narazil jsem na problém, se kterým nemohu již několik hodin hnout. //html kod <div id="a"> <div id="b">B</div> <div id="c">C</div> </div> //css kod #b,#c {width:200px; height:200px;} #a {width:500px;height:700px;} //předpokládejme padding a margin 0px Pro představu uvedu několik z nich. $(document).ready(function(){ $("#b").mouseleave(nejakaFunkce); $("#c").mouseleave(nejakaFunkce); }); //tohle se nesprávně spustí, když přejedu z jednoho na druhý $(document).ready(function(){ $("#b,#c").mouseleave(nejakaFunkce); }); //podobně nefunkční jako předchozí příklad |
||
Kcko Profil |
#2 · Zasláno: 22. 11. 2012, 01:03:06
Nejak to nedává logiku. Najedeš si na div#b, z něj odjedeš na div#c a když odjedeš z div#c tak se spustí funkce? Čekáš, že se takhle někdo bude chovat?
Pokud ano tak si do nějaké proměnné nebo elementu pomocí metody data ulož stav že jsi byl v divu#b a čekej až se dostaneš na c a pak pryč (pryč = mimo #c a zároven ne do #b) a pak to odpal. Přijde mi to ovšem nějaké celé divné. |
||
ALLSSA Profil |
#3 · Zasláno: 22. 11. 2012, 02:02:31
Ne, právě naopak. Tak znova. Pokud budu v div#b, tak nic. Pokud budu v div#c, tak nic. Pokud odjedu z div#b do div#c (nebo naopak), tak taky nic. Ale pokud odjedu z div#b a zároveň z div#c (tzn. kurzor myši odjede jinam, než nad divy #b nebo #c), tak se spusti funkce.
Je to srozumitelnější? Btw. nehledám následující řešení: $(document).ready(function(){ $("#a > div").mouseleave(nejakaFunkce); }); Dalo by se říct, že potřebuju následující: $(document).ready(function(){ $("#b A ZÁROVEŇ #c").mouseleave(nejakaFunkce); }); Existují dvě varianty. 1)že jsem slepej a nenašel jsem to v dokumentaci nebo 2) jsem si vymyslel blbost, která se nedá (což si nechci připustit) |
||
Joker Profil |
#4 · Zasláno: 22. 11. 2012, 09:31:29
ALLSSA:
V první řadě: „Pokud odjedu z div#b do div#c (nebo naopak), tak taky nic.“ Ty události nenastanou současně. Čili nějaké „a zároveň“ nedává smysl, nejdřív nastane událost onmouseout na prvku b a potom onmouseover na prvku c. Asi by to šlo řešit takhle: - Budou tři globální proměnné: Příznaky „myš nad b“, „myš nad c“ a časovač - Událost najetí myší na b či c nastaví příslušný příznak. - Událost opuštění b či c smaže příznak a není-li už nastaven časovač, načasuje spuštění kontrolní funkce a uloží do časovače. Načasování by mělo být dost dlouhé, aby se provedly ty události a zároveň dost krátké, aby uživatel necítil prodlevu. Začal bych tak se 100ms. - Kontrolní funkce vyčistí časovač*, zkontroluje oba příznaky a pokud jsou false, spustí daný kód. *Teď si nejsem jistý, co vlastně obsahuje proměnná s vypršeným časovačem |
||
ALLSSA Profil |
#5 · Zasláno: 22. 11. 2012, 10:49:51
Joker:
„Ty události nenastanou současně. Čili nějaké ‚a zároveň‘ nedává smysl, nejdřív nastane událost onmouseout na prvku b a potom onmouseover na prvku c.“ To já vím, ale předpokládl jsem, že je to zřejmé. Doufal jsem, že existuje něco jako znak ",", který znamená v podstatě NEBO, jelikož se funkce provede (v našem případě) po odjetí z div#b nebo div#c. Podstatou by bylo, aby si to samo kontrolovalo zda po odjetí z prvního prvku je kurzor nad druhým prvkem nebo mimo oba dva a tudíž se může nebo nesmí provést funkce provést. Abych ve výsledku nemusel programovat něco, co již v jQuery existuje. „Asi by to šlo řešit takhle:“ Mě napadlo něco podobného, ale bez toho časovače. Za ten velice děkuji. Naprogramuji to a přidám sem výsledný kód, jak jsem to řešil. |
||
Chamurappi Profil |
#6 · Zasláno: 22. 11. 2012, 10:50:00
Reaguji na ALLSSu:
Musíš nad tím přemýšlet čtyřrozměrně :-) „nehledám následující řešení“ To by také nefungovalo podle tvých představ. Úplně nejsnazší je dát oba elementy do společného rodiče a navěsit události na něj. Méně hezká možnost je při onmouseout načasovat spuštění tvé funkce a při onmouseover tenhle časovač rušit.
|
||
ALLSSA Profil |
Chamurappi:
„Úplně nejsnazší je dát oba elementy do společného rodiče a navěsit události na něj.“ :-D Kdyby to bylo možné, už bych to udělal. Tenhle kód jsem vytvořil pouze pro názornost. Ve skutečnosti chci naráz ovlivňovat několik, pokaždé jiné i jiný počet, různých elementů (jednou 3xspan a 2xdiv, podruhé 1xp a 4xa). Uznávám, že je to těžko použitelné, ale jelikož se jQuery učím, tak zkouším různé věci. Jde mi hlavně o pochopení. Dovedu si to představit např. u menu. I tak děkuji. |
||
Chamurappi Profil |
#8 · Zasláno: 22. 11. 2012, 14:10:27
Reaguji na ALLSSU:
„Kdyby to bylo možné, už bych to udělal.“ Proč to není možné? Ty elementy (je jedno, jaké jsou a kolik jich je) spolu mají sousedit, ne? Tak proč nejde sestavit HTML strukturu tak, aby měly společný obal? „jelikož se jQuery učím“ Nejprve by bylo dobré pochopit, jak funguje DOM a JavaScript a vůbec celý systém událostí. Selektor v jQuery ti umožňuje vybrat skupinu elementů, ale žádné užší sdružení té skupiny se nekoná. Vesměs všechny metody, které pak voláš na nalezené množině, pracují individuálně s jednotlivými elementy. Zjednodušeně řečeno je návratová hodnota funkce $ jen obyčejné pole a metody na tomto poli jsou pouhé zkratky pro průchod pole cyklem + zavolání příslušné metody.
|
||
ALLSSA Profil |
#9 · Zasláno: 22. 11. 2012, 14:28:40
Chamurappi:
„Proč to není možné?“ Na to je jednoduchá odpověď. Jelikož mohou mít element #b a #c jinou šířku a výšku. Pak to bude blbnout. Uznávám, že v příkladu nahoře jsem to neuvedl a je to moje chyba. „Nejprve by bylo dobré pochopit, jak funguje DOM a JavaScript“ Pracuju na tom nějak současně. To co se mi líbí si vyzkouším a pod. Každopádně díky za tip. |
||
panther Profil |
#10 · Zasláno: 22. 11. 2012, 14:39:22
ALLSSA:
„Jelikož mohou mít element #b a #c jinou šířku a výšku.“ to ještě nemusí být předpoklad neúspěchu. Kdybys ukázal konkrétní problém, dalo by se na něj řešení najít. V opačném případě mi to tipování „co by kdyby“ přijde jako plýtvání časem a budeš se muset spokjit s tím, co už tu padlo. |
||
joe Profil |
#11 · Zasláno: 22. 11. 2012, 22:23:04
Jde to různými způsoby, třeba i bez timeru.
panther: „to ještě nemusí být předpoklad neúspěchu.“ Pravděpodobně ale bude. |
||
Chamurappi Profil |
#12 · Zasláno: 23. 11. 2012, 11:19:59
Reaguji na ALLSSu:
„Jelikož mohou mít element #b a #c jinou šířku a výšku.“ Pokud znáš jejich pozice i velikost, tak to není problém, můžeš je pozicovat a rodič může mít nulové rozměry. Reaguji na joa: Ušetříš sice časovač, ale místo toho zpracováváš každé šustnutí myší. |
||
Kcko Profil |
#13 · Zasláno: 23. 11. 2012, 13:11:09
joe,
Chamurappi: Reaguji na joa: Ušetříš sice časovač, ale místo toho zpracováváš každé šustnutí myší. Navíc to nefunguje tak jak si zadavatel přál. |
||
joe Profil |
#14 · Zasláno: 24. 11. 2012, 15:01:53
Chamurappi:
„Ušetříš sice časovač, ale místo toho zpracováváš každé šustnutí myší.“ Vím, někdy to ale může být žádoucí, než využití časovače. |
||
vosa Profil * |
#15 · Zasláno: 24. 11. 2012, 15:20:29
Teď si nejsem jistý jestli by to fungovalo... ale co takhle všem těm prvkům přiřadit nějakou třídu a pak nastavit:
onMouseOut z prvku dane tridy- zapnout casovac: za 100ms spustit nejakou fci, onMouseMove na prvku dane tridy-zrusit casovac což? |
||
joe Profil |
#16 · Zasláno: 24. 11. 2012, 15:31:10
Kcko:
„Navíc to nefunguje tak jak si zadavatel přál.“ Pak jsem to ani po třech přečtení asi moc nepochopil... takže pokud to nefunguje tak, jak ALLSSA chtěl, pak se omlouvám za zmatení. |
||
Časová prodleva: 11 let
|
0