Autor | Zpráva | ||
---|---|---|---|
valad Profil |
#1 · Zasláno: 30. 5. 2013, 23:54:56
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 |
#2 · Zasláno: 31. 5. 2013, 00:20:56
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 |
#3 · Zasláno: 31. 5. 2013, 00:51:19
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 |
#4 · Zasláno: 31. 5. 2013, 00:52:03
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 |
#5 · Zasláno: 31. 5. 2013, 01:23:50
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 |
#6 · Zasláno: 31. 5. 2013, 01:45:44
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 |
#7 · Zasláno: 31. 5. 2013, 08:10:34
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 |
#10 · Zasláno: 31. 5. 2013, 12:40:24
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; } 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; } 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 |
#13 · Zasláno: 31. 5. 2013, 13:41:21
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 |
#14 · Zasláno: 31. 5. 2013, 13:48:48
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 |
#15 · Zasláno: 31. 5. 2013, 14:01:22
Č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 |
#16 · Zasláno: 31. 5. 2013, 14:44:37
Nevim, vic tu o tom nemam. Ani verzi safari. Nodetype = 3 je textnode.
|
||
Časová prodleva: 3 dny
|
|||
_es Profil |
#17 · Zasláno: 3. 6. 2013, 11:17:15
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 |
#18 · Zasláno: 3. 6. 2013, 13:22:22
_es: Protoze to tak delaji vsichni. Jen jim to peta nezduraznuje v 10 komentarich.
|
||
_es Profil |
#19 · Zasláno: 3. 6. 2013, 13:57:43
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. |
||
Časová prodleva: 6 dní
|
|||
preca1 Profil |
#20 · Zasláno: 9. 6. 2013, 12:45:49
peta, pcmanik:
> Ja tu mam poznaky jeste pro Safari if (targ.nodeType == 3) { // defeat Safari bug targ = targ.parentNode; } „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.“ |
||
Časová prodleva: 11 let
|
0