Fare olayları yalnızca âfare olayı ya da manipülasyonuâ ile gerçekleÅmez, aynı zamanda dokunmatik cihazlara da uyumlu hale getirmek için bu cihazlarda taklit edilir.
Bu bölümde fare olayları ve özellikleri hakkında daha fazla ayrıntıya gireceÄiz.
Fare olay türleri
Fare olaylarını âbasitâ ve âkarmaÅıkâ olarak iki kategoriye ayırabiliriz.
Basit fare olayları
En çok kullanılan basit olaylar Åunlardır:
mousedown/mouseup- Fare ile bir öÄenin üzerine tıklanır / bırakılır.
mouseover/mouseout- Fare ile bir öÄenin üzerine gelinir / uzaklaÅılır.
mousemove- Bir öÄenin üzerine yapılan her fare bu olayı tetikler.
â¦BaÅka olay türleri de var, bunları daha sonra ele alacaÄız.
KarmaÅık fare olayları
click- Farenin sol tuÅuna basıldıÄında, aynı öÄe üzerinde
mousedownve ardındanmouseupolayının gerçekleÅmesi ile tetiklenir. contextmenu- Farenin saÄ tuÅuna basıldıÄında,
mousedownolayı gerçekleÅirse tetiklenir. dblclick- Bir ögenin üzerine çift tıklandıktan sonra tetiklenir.
KarmaÅık olaylar basit olayların birleÅimi, bu yüzden teoride onlarsız da iÅlerimizi görebiliriz. Ama karmaÅık olayların var olmaları iyi çünkü kullanıÅlılar.
Olay sırası
Bir eylem birden fazla fare olayı tetikleyebilir.
ÃrneÄin, bir tıklama, düÄmeye basıldıÄında önce mousedown olayını, ardından mouseup olayını ve fare butonu bırakıldıÄında click olayını tetikler.
Tek bir eylemin birden çok fare olayı baÅlattıÄı durumlarda, bunların sırası sabittir. İÅleyiciler her zaman Åu sıraya göre çaÄırılır: mousedown â mouseup â click. Olaylar aynı sırayla iÅlenir: önce onclick çalıÅır sonra onmouseup.
GerçekleÅen eylemleri görmek için aÅaÄıdaki butonu tıkla. Ãift tıklamayı da dene.
AÅaÄıdaki test standında, tüm fare olayları kaydedilir ve aralarında 1 saniyeden fazla gecikme varsa, yatay bir cetvel ile ayrılırlar.
Ayrıca, fare butonuna tıklandıÄında algılanmasını saÄlayan âwhichâ özelliÄini görebilirsiniz.
Tıklamayla ilgili bütün olaylar `button` özelliÄine sahiptir ve bu da olayın tam olarak hangi fare butonu ile çalıÅtıÄını bulmamızı saÄlar.
`click` ve `contextmenu` olayları için kullanılamaz çünkü `click` sadece sol tıklamada, `contextmenu` sadece saÄ tıklamada gerçekleÅir.
Ancak `mousedown` ve `mouseup` olaylarını takip etmek istersek, o zaman `button` özelliÄine ihtiyacımız olur, çünkü bu olaylar herhangi bir fare butonu ile gerçekleÅebilir, bu yüzden `button` "right-mousedown" (saÄ- tıklama) ile "left-mousedown" (sol-tıklama) olayını ayırt etmemizi saÄlar.
Ãç olası deÄer vardır:
| Button State | event.button |
| Sol tuÅa tıklama | 0 |
| Orta tuÅa tıklama | 1 |
| SaÄ tuÅa tıklama | 2 |
| X1 tuÅa tıklama (geri tuÅu) | 3 |
| X2 tuÅa tıklama (ileri tuÅu) | 4 |
ÃoÄu fare aygıtında yalnızca sol ve saÄ düÄmeler bulunur, bu nedenle olası deÄerler 0 veya 2'dir. Dokunmatik aygıtlar da üzerlerine bir kez dokunduÄunda benzer olaylar oluÅturur.
Ayrıca, o anda basılan tüm düÄmelere düÄme baÅına bir bit olmak üzere tamsayı olarak sahip olan `event.buttons` özelliÄi vardır. Uygulamada bu özellik çok nadiren kullanılır, ihtiyacınız olursa [MDN](https://developer.mozilla.org/en-US/docs/Web/api/MouseEvent/buttons)'de ayrıntıları bulabilirsiniz.
## Zamanı geçmiŠwhich butonu
Eski kodlar, olası deÄerlerle buton elde etmenin eski bir yolu olan event.which özelliÄini kullanabilir:
- `event.which == 1` -- sol tuÅa tıklama
- `event.which == 2` - orta tuÅa tıklama
- `event.which == 3` - saÄ tuÅa tıklama
**Åu an itibariyle artık kullanımdan kaldırılan event.which olayını artık kullanmamalıyız.**
## DeÄiÅtiriciler: shift, alt, ctrl and meta
Tüm fare olayları, basılan deÄiÅtirici tuÅlarla ilgili bilgileri içerir.
Ãzellikler (properties):
- `shiftKey`
- `altKey`
- `ctrlKey`
- `metaKey` (`key:Cmd` Mac için)
ÃrneÄin, aÅaÄıdaki düÄme yalnızca `Alt+Shift`+fare tıklaması ile beraber çalıÅır:
```html autorun height=60
<button id="button">Alt+Shift+Click tıkla!</button>
<script>
button.onclick = function(event) {
if (event.altKey && event.shiftKey) {
alert('Hooray!');
}
};
</script>
Ctrl yerine Cmd kullanılır.Windows ve Linux iÅletim sistemlerinde Alt, Shift and Ctrl deÄiÅtiricileri bulunur. Mac için bir deÄiÅtirici daha var: Cmd, bu metaKey özelliÄine karÅılık gelir.
ÃoÄu zaman Windows/Linux üzerinde bir durum için Ctrl kullanılırken, Mac üzerinde Cmd kullanılır. Bu yüzden Windows kullanıcısı Ctrl+Enter ya da Ctrl+A kullandıÄı zaman, Mac kullanıcısı Cmd+Enter ya da Cmd+A kullanır. Birçok uygulama da Ctrl yerine Cmd kullanır.
Dolayısıyla, Ctrl + tıklama gibi kombinasyonları kullanacagımız zaman, Mac için Cmd + tıklamayı kullanmak mantıklıdır. Bu, Mac kullanıcıları için fiziksel açıdan da daha rahat bir çözümdür.
Mac kullanıcılarını Ctrl + tıklama yapmaya zorlasak bile sorun Åudur: Ctrl ile sol tıklama, Macâte saÄ tıklama olarak yorumlanır ve Windows / Linux gibi click deÄil, contextmenu olayını oluÅturur.
Dolayısıyla, tüm iÅletim sistemlerinin kullanıcılarının kendilerini rahat hissetmelerini istiyorsak, o zaman ctrlKey ile birlikte metaKey kullanmalıyız.
JS kodu için bu, `if (event.ctrlKey || event.metaKey) Åeklinde tuÅları kontrol etmemiz gerektiÄi anlamına gelir.
Klavye kombinasyonları ziyaretçinin klavyesi varsa çalıÅır. Ancak eÄer kullanıcı klavyesiz kullanıyorsa â o zaman aynısını yapmanın baÅka bir yolu var.
Koordinatlar: clientX/Y, pageX/Y
Tüm fare olaylarının iki farklı türde koordinatları vardır:
- Pencereye baÄlı koordinatlar (Window-relative):
clientXveclientY. - Belgeye baÄlı koordinatlar (Document-relative):
pageXvepageY.
Kısaca, belgeye baÄlı koordinatlar pageX / Y, belgenin en sol üst köÅesinden sayılır ve sayfa kaydırıldıÄında da deÄiÅmez, clientX / Y ise geçerli pencerenin (window) sol üst köÅesinden sayılır. Sayfa kaydırıldıÄında deÄiÅirler.
ÃrneÄin, 500x500 boyutunda bir penceremiz varsa ve fare en sol üst köÅedeyse, o zaman clientX ve clientY 0 olur. Fare tam ortadaysa, o zaman belgenin neresinde olursa olsun clientX ve clientY 250 olur. position:fixed ile benzer Åekilde çalıÅır.
clientX/clientY deÄerlerini görmek için fare ile üzerinden geç. (âiframeâ içinde yapıldı, bu nedenle koordinatlar bu âiframeâ e göredir):
<input onmousemove="this.value=event.clientX+':'+event.clientY" value="Mouse over me">
Belgeye baÄlı koordinatlar, pencereden deÄil, belgenin sol üst köÅesinden sayılır. âPageXâ, âpageYâ koordinatları, belge düzeyinde âposition: absoluteâ ile benzerdir.
Bunlar arasındaki farkı burada daha detaylı olarak iÅledik Coordinates.
mousedown olayında metin seçimini önleme
Fare tıklamalarının rahatsız edici olabilecek bir yan etkisi vardır. Ãift tıklama metni seçer.
Bütün tıklama olaylarını kendimiz kontrole almak istiyorsak, âekstraâ olarak metin seçimi iyi olmayabilir.
ÃrneÄin, aÅaÄıdaki metne çift tıklamak, iÅleyicimize ek olarak bir tıkladıÄımız kelimeyi seçer:
<b ondblclick="alert('dblclick')">Bana çift tıkla</b>
Seçimi durdurmanın bir CSS yolu vardır: user-select özelliÄini buradan inceleyebilirsiniz. CSS UI Draft.
ÃoÄu tarayıcı bunu destekler:
<style>
b {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
</style>
Ãnce...
<b ondblclick="alert('Test')">
Seçilemez
</b>
...Sonra
Åimdi âSeçilemezâ üzerine çift tıklarsanız, seçilmez. ÃalıÅıyor gibi görünüyor.
â¦Ancak potansiyel bir sorun var! Metin gerçekten seçilemez hale geldi. Kullanıcı seçimi âÃnceâ den baÅlatıp âSonraâ ile bitirse bile, seçim âSeçilemeyenâ kısmı atlar. Metnimizi gerçekten seçilemez hale getirmek istiyor muyuz?
ÃoÄu zaman bunu istemeyiz. Bir kullanıcının metni seçmek, kopyalamak veya diÄer ihtiyaçları için geçerli nedenleri olabilir. Bunu yapmalarına izin vermezsek bu rahatsız edici olabilir. Yani bu çözüm o kadar iyi deÄil.
İstediÄimiz sadece çift tıklamayla seçimi engellemek, hepsi bu.
Metin seçimi mousedown olayıyla beraber gerçekleÅen bir tarayıcı iÅlemi. Bu yüzden alternatif yöntem mousedown olayını engellemek, Åu Åekilde:
Ãnce...
<b ondblclick="alert('Click!')" onmousedown="return false">
Ãift tıkla
</b>
...Sonra
Artık kalın yazı tipiyle yazılmıŠöÄe çift tıklamayla seçilmiyor.
İçindeki metin hala seçilebilir. Ancak, seçim metnin kendisinde deÄil, ondan önce veya sonra baÅlamalıdır. Yine de genellikle bu sorun olmaz ve en iyi çözüm alternatifidir.
Seçimi önlemek yerine, olay iÅleyicisini âpost-factumâ iptal edebiliriz. Åu Åekilde:
Ãnce...
<b ondblclick="getSelection().removeAllRanges()">
Ãift tıkla!
</b>
...Sonra
Kalın yazı tipiyle yazılmıŠöÄeye çift tıklarsanız, seçim görünür ve hemen kaldırılır. Yine de bu hoÅ görünmüyor.
İçeriÄimizi kopyalayıp yapıÅtırmaya karÅı korumak için seçimi devre dıÅı bırakmak istiyorsak, baÅka bir özellik kullanabiliriz.
<div oncopy="alert('Copying forbidden!');return false">
Sevgili kullanıcı,
Kopyalama bu metin için yasaktır.
EÄer JS ve HTML biliyorsanız yine de buradaki her Åeyi kopyalayabilirsiniz.
</div>
EÄer <div> içindeki bir yazıyı kopyalamaya çalıÅırsanız, iÅe yaramaz, çünkü normal olarak varsayılan oncopy özelliÄi Åimdi engellendi.
Elbette bu, kullanıcının HTML kaynaÄını açmasını engelleyemez, ancak herkes bunu nasıl yapacaÄını bilmiyor.
Ãzet
Fare olayları aÅaÄıdaki özelliklere sahiptir:
-
Buton:
button. -
DeÄiÅtirici tuÅlar (basıldıÄında
truedeÄerini verir):altKey,ctrlKey,shiftKeyandmetaKey(Mac).- Ctrl ile iÅlem yapacaksanız, Mac kullanıcılarını unutmayın, Mac kullanıcıları Cmd kullanırlar bu sebeple
if (e.metaKey || e.ctrlKey)ile bunu kontrol etmeniz gerekir.
- Ctrl ile iÅlem yapacaksanız, Mac kullanıcılarını unutmayın, Mac kullanıcıları Cmd kullanırlar bu sebeple
-
Pencereye baÄlı koordinatlar :
clientX/clientY. -
Belgeye baÄlı koordinatlar :
pageX/pageY.
Ayrıca, tıklamaların istenmeyen bir yan etkisi olarak metin seçimiyle uÄraÅmak da önemlidir.
Bunu yapmanın birkaç yolu vardır, örneÄin:
- CSS methodu
user-select:nonetamamıyla metin seçimini engeller. - Ondan sonra gelecek metin seçimini iptal eder;
getSelection().removeAllRanges(). - Fare
mousedownolayını engelleyerek varsayılan metin seçimi durumunu engeller (genellikle en iyi çözüm).

Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)