
JavaScriptové události myši
Popis všech možných událostí, které lze v JavaScriptu vyvolat myší. Návod, jak je odchytávat a blokovat.
Při vytváření JavaScriptové aplikace existuje spoustu událostí a postupů, jak zpracovávat akce vyvolané myší (kursorem/ukazatelem/prstem).
Kliknutí myši
onclick-
Základní kliknutí, rozumí se tím stisknutí a uvolnění levého tlačítka myši. To uvolnění je důležité. Když se po stisknutí myši s kursorem trochu pohne, událost
onclickse nevyvolá. To může být výhoda i nevýhoda.- Uživatel si může kliknutí rozmyslet a při stisknutém tlačítku pohnout kursorem a akci tak zrušit.
- Zároveň při rychlém klikání může první případ vyvolat omylem. Proto v situaci, kdy je očekáváno rychlejší klikání, může být výhodnější
onmousedown. Rychlejšího vyvolání událostionmousedown(oprotionclicku) je možné využít pro zrychlení AJAXvé aplikace, kde načítání proběhne už při stisknutí tlačítka. Nečeká se na uvolnění.
KliknoutStejného efektu jako atributem
onclicklze docílit pseudo-protokolemjavascript:u odkazu<a>.Není to ovšem moc ideální řešení z pohledu zařízení, co nepodporují JS, vznikne v nich nesmyslný odkaz.
Při vytváření klikacích prvků je dobré myslet na uživatele ovládající web klávesnicí. Nebude-li mít element s
onclickem atributtabindex, nepůjde na něj spolehlivě ve všech prohlížečích odTabovat. Více v testu událostionclick. onmousedown-
Vyvolá se ihned po stisknutí libovolného tlačítka myši. Je to tedy způsob, jak odchytit pravé tlačítko nebo kolečko.
KliknoutVětšinou jsou čísla tlačítek následující:
- 1 — levé tlačítko,
- 2 — prostřední tlačítko / kolečko,
- 3 — pravé tlačítko.
Odchytnout pravé tlačítko je většinou možné i přes událost kontextové nabídky (
oncontextmenu). Fungujete díky tomu, že pravé tlačítko zpravidla kontextovou nabídku vyvolává. onmouseup-
Vyvolá se po uvolnění libovolného tlačítka na elementem. Vyvolá se i v případě, že se tlačítko stiskne někde jinde, přejede se nad element a uvolní.
KliknoutJinak, co se týče rozlišování, které tlačítko bylo uvolněno, funguje stejně jako
onmousedown. ondblclick-
Aktivuje se dvojklikem levého tlačítka (dvojité rychlé kliknutí).
KliknoutPravé tlačítko nebo kolečko myši dvojlik nevyvolá.
Objekt event
Pro zjištění podrobností o kliknutí nebo pro zablokování výchozích akcí slouží objekt event, jeho použití a sjednocení napříč prohlížeči vypadá následovně:
<span onmousedown='funkce(event)'>Kliknout</span>
function funkce(e) {
e = e || window.event;
}
- Kód tlačítka je v
e.which, - Souřadnice kursoru v době kliknutí je nutné dále sjednocovat.
Stornování výchozí akce
Někde je vhodné stornovat výchozí akci prohlížeče, což je například kontextová nabídka nebo ikona pro posouvání po stránce vyvolaná stisknutím kolečka; případně prokliknutí odkazu nebo odeslání formuláře.
Klíčem je příkaz return false.
Před stornováním je třeba důkladně rozmyslet, zda narušení výchozí funkčnosti prohlížeče nebude návštěvníka obtěžovat.
(Mimochodem, CSS vlastnost pointer-events umí stornovat jen vlastní CSS/JS události. Ty výchozí z prohlížeče nikoliv.)
Zablokování odeslání formuláře
Příkaz return false dokáže zrušit víceméně všechny události.
Zamezit poslání formuláře je možné buď v onclicku u jednotlivých odesílacích polí (<input type=submit>/<button type=submit>), nebo spolehlivěji v události onsubmit celého formuláře.
<form action="?akce" onsubmit="vlastniFunkce(); return false">
Zablokování odkazu
Není problém vystornovat přechod na adresu hrefu z odkazů.
Hodnotu false může vracet i přímo vlastniFunkce (ukázka):
function vlastniFunkce() {
// nějaký kód
return false;
}
<a href='http://jecas.cz' onclick='return vlastniFunkce()'>Odkaz</a>
Zablokování a odchytnutí pravého tlačítka
Kontextovou nabídku po stitknutí pravého tlačítka můžeme zablokovat událostí oncontextmenu.
<span oncontextmenu="return false">Kliknout</span>
Že bylo pravé tlačítko stisknuto následně odchytne událost onmousedown (ukázka).
Zablokování kolečka
Chceme-li tlačítko kolečka zapojit do ovládání aplikace, je potřeba stornovat jeho běžnou funkci — zobrazení čtyřsměrné šipky pro posouvání po stránce pohybem kursoru.
Kolečko / prostřední tlačítko je trochu problematické, protože ne každý návštěvník dokáže vyvolat jeho stisknutí.
Blokaci vytvoří return false v události onmousedown (ukázka). Nefunguje v Opeře 12.
Pohyb myši
Kromě mačkání tlačítek je možné reagovat i na posouvání kursoru.
onmouseover-
Vyvolá se v momentě najetí myší na element. V CSS je alternativa pseudotřída
:hover.Najet.Pomocí
onmouseover/onmouseoutlze i zjišťovat směr odjetí/přijetí kursoru.České vysvětlení atributu
onmouseoversepsal před lety Miloš F. Pechar. onmouseout-
Opak
onmouseoveru. Vyvolá se při odjetí. onmousemove-
Vyvolává se neustále při pohybování se myší nad elementem.
Objekt event
I u posouvání kursoru je možné další užitečné věci jako třeba posici kursoru zjistit z eventu.
„Praktické“ použití zjišťování posice při posouvání myši je u CSS baterky.
Výběr textu
Taktéž pro vybírání textu na stránce tažením myši se stisknutým tlačítkem existuje událost.
onselectstart-
Vyvolá se při označování textu.
Vybrat textChová se dost rozdílně napříč prohlížeči:
- V Opeře 12 a Firefoxu nedělá nic.
- Ve Webkitu se spustí už při stisknutí levého i pravého tlačítka, nemusí se ani nic označit.
- V IE se spustí v okamžiku, kdy se alespoň něco vybere.
V IE a Chrome tak lze pomocí
return falseznemožnit výběr textu (ukázka).
Zablokování výběru textu
K tomu nakonec událost onselectstart není ani příliš potřeba. Stornováním onmousedownu dosáhneme v zásadě téhož ve všech prohlížečích:
onmousedown="return false".
V IE a staré Opeře 12 funguje atribut unselectable nastavený na on.
unselectable="on".
Zablokování v CSS
V CSS k blokování výběru slouží vlastnost user-select. Funguje od IE 10, nefunguje v Opeře 12. V ostatních prohlížečích funguje jen s CSS prefixy (ukázka).
Kromě vlastnosti user-select by mohlo jít označování zakamuflovat pseudo-elementem ::selection (ukázka).
elment::selection {background-color: transparent}
Používat ::selection je možné od IE 9, ve Firefoxu s -moz- prefixem.
Rolování kolečkem
onmousewheel-
Provede se při roztočení kolečka nad daným elementem.
Roztočit kolečkoZ
eventu je možné zjistit směr, jakým se roluje (nahoru/dolů).Co se týče rolování kolečkem, tak existují obrovské rozdíly napříč prohlížeči.
- Firefox nezná událost
onmousewheel. Dá se v něm ale využít událostDOMMouseScrollnebo nová událostonweel. - Směr rolování se získává z
wheelDelta(Webkit umí rozlišit směr rolování (vodorovně/svisle) na základě hodnotwheelDeltaXawheelDeltaY). - Ve starších IE a ve Firefoxu při použití
DOMMouseScrollje směr ve vlastnostidetail. - Firefox a Webkit při použití
onweelzná dokoncedeltaX,deltaY,deltaZ(ukázka).
- Firefox nezná událost
Kód určující, kterým směrem se roluje, funkční ve všech prohlížečích, by mohl vypadat následovně — živá ukázka.
Drag and drop události
Další události, které je možné vyvolat myší, jsou ty pro přetahování elementů po stránce bez většího množství JS kódu.
Funkční s omezeními od IE 8 (není možné přetahovat soubory z operačního systému do prohlížeče a podobně). Ve starších prohlížečích je posouvání elementů možné docílit přes onmousedown (zapne přesouvání), onmousemove (provede přesouvání) a onmouseup (ukončí přesouvání) (ukázka).
ondragstart-
Vyvolá se při započatí tažení (ukázka).
<div draggable="true" ondragstart="event.dataTransfer.setData('Text', 'Obsah, který se přesune')" > Obsah je možné přesunovat. </div>Atribut
draggableumožňuje samotné přetahování elementu. Pomocíevent.dataTransfer.setDatase potom nastaví obsah, který se má přesouvat.Pro přesun HTML obsahu si lze s
Texttypem vystačit (jiné typy ostatně nefungují ve starších IE).Ovlivnit podobu kursoru, který signalisuje, zda se bude obsah přesouvat/kopírovat, je možné přes
event.dataTransfer.effectAllowed(možné hodnoty).Pří řešení drag & dropu způsobem pro IE 7 a starší bez
drag/dropudálostí je vhodnéondragstartvystornovat:<element ondragstart="return false"> ondragenter-
Vyvolá se v okamžiku, kdy nad elementem potáhneme přesouvatelný objekt. Hodí se tedy například k signalisaci, že je možné tažený obsah upustit.
ondragover-
Něco jako
onmousemove— vyvolává se, když se nad elementem hýbe s přetahovaným obsahem. Užitečné k samotnému umožněnídropu přesevent.preventDefault(). ondragleave-
Aktivuje se, když se při tažení opustí element s touto událostí. Může například zrušit signalisaci, kterou vyvolá
ondragstart.Ukázka kombinace
ondragenteraondragleave. ondrag-
Událost se vyvolává neustále při pohybu přesouvaného elementu.
ondrop-
Vyvolá se při upuštění obsahu nad elementem, který
droppodporuje. Podporadropnutí se umožní zabráněním výchozí akce —preventDefault().<div ondragover="event.preventDefault()" ondrop="alert('Položeno')"> </div>V události
ondropje možné získat dříve nastavený obsah pomocí:event.dataTransfer.getData("text/plain"); ondragend-
Nastavuje se pro přesouvatelný (
draggable) element a spustí se při ukončení přesouvání elementu. Je jedno, jakým způsobem přetahování skončilo (úspěšným/neúspěšnýmdropem, stornováním klávesy Esc apod.).
Příklad drag and dropu
Ukázka přesouvání obsahu. V zásadě existují dva způsoby, jak přesouvat/kopírovat obsah.
- Při započatí přesouvání (
ondragstart) nastavit metodouevent.dataTransfer.setDatapotřebný HTML obsah. A při dokončení (ondrop) ho vyvolat přesevent.dataTransfer.getDataa umístit do elementu. - Přesouvat v
event.dataTransferjen identifikátor přetahovatelného elementu. A po skončenídragování si ho najít nějakou metodou DOMu.
Samostatná ukázka. Přesouvací kursor se zapíše přes cursor: move.
Vyvolaná událost:
Hotové řešení Sortable usnadní vytváření drag and drop aplikací (nepoužívá jQuery).
Dotykové události (ontouch*)
Pro dotyková zařízení existuje obdoba onmouse* událostí.
ontouchstart-
Obdoba
onmousedown. Spustí se, jak už název vypovídá, při dotyku.Dotyků může být více, proto se věci jako souřadnice nedolují z
eventu, ale zevent.touchess indexem dle pořadí dotyku (první dotyk bude vevent.touches[0]). ontouchmove-
Obdoba
onmousemove. ontouchend-
Obdoba
onmouseup. Souřadnice pro událostiontouchmoveiontouchendjsou vevent.changedTouches[0].
Využitím dotykových událostí je možné vytvořit třeba tzv. swipování — Add Finger-Swipe Support to Webpages.
Související články
JavaScript null a undefined
Rozdíly mezi null a undefined v JavaScriptu, kdy je používat a jak se vyhnout běžným chybám.
Sleep v JavaScriptu
Jak implementovat sleep/delay funkcionalitu v JavaScriptu pomocí Promise a async/await
JavaScript Battery API
Jak v JS zjistit stav baterie, co dnes funguje a kdy API nepoužívat.