Autor Zpráva
valad
Profil
Ako sa dá detekovať, z ktorého smeru (zhora, zdola, zľava, sprava) vošiel kurzor myši na div element a ktorým smerom ho opustil? Najlepšie pomocou jQuery.
Str4wberry
Profil
Postup by mohl být následující.
1) Při pohybu nad elementem (onmousemove) si nějak ukládat souřadnice (například do data-* atributu).
2) Při odjetí z elementu (onmouseout) si souřadnice přečíst a porovnat s rozměry daného elementu.
    • Když bude souřadnice X rovna šířce, vyjelo se vpravo.
    • Když bude souřadnice Y rovna výšce, vyjelo se dole.
    • Když bude souřadnice X rovna nule, vyjelo se vlevo.
    • Když bude souřadnice Y rovna nule, vyjelo se nahoře.
    • Ještě se možná může stát, že se vyjede rohem.
valad
Profil
Niečo na ten spôsob ma tiež napadlo, ale myslím že by to fungovalo len ak by sa kurzor pohyboval veľmi pomaly.

Pozri napr. toto demo na konci - pri svižnejšom opustení elementu ostanú vždy iné súradnice.
Chamurappi
Profil
Reaguji na Str4wberryho:
například do data-* atributu
Na to nepotřebuje používat nic tak složitého, jako je atribut, může si pověsit vlastní vlastnost přímo na element. Nebo si je ještě jednodušeji uložit v lokálních proměnných.

Když bude souřadnice … rovna …
Testování rovnosti by nejspíš nebylo moc spolehlivé, protože dráha kurzoru je spojitá jen při pomalých pohybech. Standardně myš skáče po větších úsecích než 1 pixel.

Myslím, že se ptá spíš na směr přijetí. To je trochu složitější, protože musí sledovat událost onmousemove na celém okolí, a zajistit stoprocentní funkčnost je asi i nemožné, protože myš může přijet z něčeho, co je úplně mimo prohlížeč (a třeba ho zčástí zakrývá) a tedy JavaScript se předchozí souřadnici nemá šanci dozvědět.
Str4wberry
Profil
Pravda, ten směr jsem si prve špatně přeložil.

S rovností máte pravdu, tam by bylo potřeba počítat s tolerancí.

Jinak mě ještě napadá, co umístit po stranách elementu jakési elementy-detektory? Ty se snad přeskočit nepovede, ne? Ale je fakt, že ten příjezd z prvku překrývajícího prohlížeč asi vyřešit nepůjde, jedině snad se snažit zaznamenat přibližný směr pohybu.
valad
Profil
Skúšal som aj elementy-detektory, ale museli by mať aspoň 10-15 pixelov aby sa nedali "preskočiť" a tým pádom by bol v každom rohu "slepý" priestor o veľkosti štvorca so stranou rovnakého rozmeru.

Napr. tuna to majú poriešené, ale keď som videl to kvantum kódu ktorý je tam použitý, povedal som si že radšej skúsim vymyslieť iné riešenie :)
Joker
Profil
valad:
pri svižnejšom opustení elementu ostanú vždy iné súradnice.
Můžeme ale předpokládat, že se kurzor mezi opuštěním elementu a zachycením souřadnic pohyboval přímo rovně.
Pak to detekovat jde: Pokud Y souřadnice je mezi vrškem a spodkem prvku a X je za pravým okrajem, předpokládejme, že kurzor odjel pravým okrajem. Pokud Y souřadnice je nad vrškem prvku a X za pravým okrajem, předpokládejme, že odjel pravým horním rohem. A tak dále.

Podobně by šlo řešit i najetí na prvek, kdyby ten prvek byl dost velký.
1Pupik1989
Profil
Já bych zkusil něco jako:

var captureElement = document.getElementById("capture-element");

function getSide(e){
  var e = e || window.event;
  var target_width = e.target.offsetWidth,
      target_height = e.target.offsetHeight,
      coord_x = e.offsetX,
      coord_y = e.offsetY;
  
  var sidesOffset = [coord_y,target_width-coord_x,target_height-coord_y,coord_x];
  var names = ["top","right","bottom","left"];
  
  var minOffset = Math.min.apply(null,sidesOffset);
  
  return names[sidesOffset.indexOf(minOffset)];
};

captureElement.onmouseover = function(e){
  getSide(e); //nahoře,vpravo,dole,vlevo 
};
captureElement.onmouseout = function(e){
  getSide(e); //nahoře,vpravo,dole,vlevo 
};

Musí se dořešit akorát nekompatibilita při event.offsetX, event.offsetY a Array.indexOf. Lépe už to asi zachytit nepůjde.
Další možnost je ještě na Stackoverflow.com
valad
Profil
Ak tomu správne rozumiem, volanie funkcie getSide(e) na riadkoch 19 a 22 by malo vracať top, right, bottom alebo left. Mne vracia len Undefined. Elementu som nastavil id="capture-element".

Ale riešenie v odkaze vyzerá funkčne, ďakujem.
Chamurappi
Profil
Reaguji na 1Pupika1989:
var e = e || window.event;
Tady řešíš kompatibilitu, ale na dalších řádcích už ne. Starší Explorer nezná target, zná srcElement a nezná indexOf na poli.
1Pupik1989
Profil
Na target jsem zapomněl, ten indexOf jsem psal. IndexOf by šel nahradit switchem.

Nicméně jsem objevil problém v Opeře 12. Při události onmouseout jsou souřadnice v e.offsetX a e.offsetY absolutní vůči stránce.
peta
Profil
Ja tu mam poznaky jeste pro Safari
if (target.nodeType == 3) // defeat Safari bug
    {
    target = target.parentNode;
    }
Potom jsem nasel jeste jakousi poznamku s offsetem. Nemuzu ted najit svoje, tak jsem to vygoogloval (k tomu je tam jeste neco s layer)
if(typeof event.offsetX === "undefined" || typeof event.offsetY === "undefined") {
   var targetOffset = $(event.target).offset();
   event.offsetX = event.pageX - targetOffset.left;
   event.offsetY = event.pageY - targetOffset.top;
}
Mimochodem
captureElement.onmouseover = function(event){
alert(event) // a mel by tam byt event ff nebo window.event a neni treba delat podminkovani
  getSide(e); //nahoře,vpravo,dole,vlevo 
};
1Pupik1989
Profil
peta:
captureElement.onmouseover = function(event){
alert(event) // a mel by tam byt event ff nebo window.event a neni treba delat podminkovani
  getSide(e); //nahoře,vpravo,dole,vlevo 
};

IE vrátí undefined. :)
pcmanik
Profil
peta:
Co je to za poznatok k tomu Safari? Zaujíma ma to, ešte som sa s tým ošetrením nestretol / som ho nepotreboval. Pri čom konkrétne sa to prejavuje a pre akú verziu je to určené?
weroro
Profil
Čo sa týka eventov onmousemove a onmouseover, tak som si všimol, že v IE (u mňa vo verzii 7) zareaguje skôr onmousemove až potom onmouseover. V opere a chrome (v tých som to ešte skúšal) to zas reaguje opačne. Dá sa to nejak "fixnúť", alebo s tým treba počítať pri návrhu algoritmu?
peta
Profil
Nevim, vic tu o tom nemam. Ani verzi safari. Nodetype = 3 je textnode.
_es
Profil
peta:
a mel by tam byt event ff nebo window.event a neni treba delat podminkovani
Prečo zase píšeš neoverené blbosti?
peta
Profil
_es: Protoze to tak delaji vsichni. Jen jim to peta nezduraznuje v 10 komentarich.
_es
Profil
peta:
Protoze to tak delaji vsichni.
Čo robia všetci? Píšu kódy aj s komentármi, ako vraj fungujú, keď nefungujú? Názov argumentu funkcie v JS vždy „prebije“ názvy nejakých globálnejších premenných.
preca1
Profil
peta, pcmanik:
Ja tu mam poznaky jeste pro Safari
if (targ.nodeType == 3) { // defeat Safari bug
  targ = targ.parentNode;
}
Tohle pochází zřejmě z článku o vlastnostech událostí na quirksmodu:
The last two lines of code are especially for Safari. If an event takes place on an element that contains text, this text node, and not the element, becomes the target of the event. Therefore we check if the target's nodeType is 3, a text node. If it is we move to its parent node, the HTML element.

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: