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
Tohle vytvori velky ramec a v nem pod sebou 2 male. Já potřebuji, aby se spustila funkce, pokud odjedu kurzorem z divu div#b "A ZÁROVEŇ" div#c. Nechci aby se kód spustil, pokud přejedu z jednoho divu na druhý (proto "A ZÁROVEŇ"). Variant jsem vyzkoušel několik, ale nic nebylo optimální.
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
Předem děkuji za konstruktivní odpovědi.
Kcko
Profil
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
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);
});
To mě taky napadlo.
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
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
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
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
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
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
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
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
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
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
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 *
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
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í.

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: