|
| 1 | + |
1 | 2 | # Основы событий мыши |
2 | 3 |
|
3 | 4 | В этой главе мы более детально рассмотрим события мыши и их свойства. |
|
6 | 7 |
|
7 | 8 | ## Типы событий мыши |
8 | 9 |
|
9 | | -Мы можем разделить события мыши на две категории: "простые" и "комплексные". |
10 | | - |
11 | | -### Простые события |
12 | | - |
13 | | -Самые часто используемые простые события: |
| 10 | +Мы уже видели некоторые из этих событий: |
14 | 11 |
|
15 | 12 | `mousedown/mouseup` |
16 | 13 | : Кнопка мыши нажата/отпущена над элементом. |
|
21 | 18 | `mousemove` |
22 | 19 | : Каждое движение мыши над элементом генерирует это событие. |
23 | 20 |
|
24 | | -`contextmenu` |
25 | | -: Вызывается при попытке открытия контекстного меню, как правило, нажатием правой кнопки мыши. Но, заметим, это не совсем событие мыши, оно может вызываться и специальной клавишей клавиатуры. |
26 | | - |
27 | | -...Есть также несколько иных типов событий, которые мы рассмотрим позже. |
28 | | - |
29 | | -### Комплексные события |
30 | | - |
31 | 21 | `click` |
32 | 22 | : Вызывается при `mousedown` , а затем `mouseup` над одним и тем же элементом, если использовалась левая кнопка мыши. |
33 | 23 |
|
34 | 24 | `dblclick` |
35 | 25 | : Вызывается двойным кликом на элементе. |
36 | 26 |
|
37 | | -Комплексные события состоят из простых, поэтому в теории мы могли бы без них обойтись. Но хорошо, что они существуют, потому что работать с ними очень удобно. |
| 27 | +`contextmenu` |
| 28 | +: Вызывается при попытке открытия контекстного меню, как правило, нажатием правой кнопки мыши. Но, заметим, это не совсем событие мыши, оно может вызываться и специальной клавишей клавиатуры. |
38 | 29 |
|
39 | | -### Порядок событий |
| 30 | +...Есть также несколько иных типов событий, которые мы рассмотрим позже. |
40 | 31 |
|
41 | | -Одно действие может вызвать несколько событий. |
| 32 | +## Порядок событий |
| 33 | + |
| 34 | +Как вы можете видеть из приведённого выше списка, действие пользователя может вызвать несколько событий. |
42 | 35 |
|
43 | 36 | Например, клик мышью вначале вызывает `mousedown`, когда кнопка нажата, затем `mouseup` и `click`, когда она отпущена. |
44 | 37 |
|
|
49 | 42 |
|
50 | 43 | В окне теста ниже все события мыши записываются, и если задержка между ними более 1 секунды, то они разделяются горизонтальной чертой. |
51 | 44 |
|
52 | | -При этом мы также можем увидеть свойство `which`, которое позволяет определить, какая кнопка мыши была нажата. |
| 45 | +Кроме того, мы можем видеть свойство `button`, которое позволяет нам определять кнопку мыши; это объясняется ниже. |
53 | 46 |
|
54 | 47 | <input onmousedown="return logMouse(event)" onmouseup="return logMouse(event)" onclick="return logMouse(event)" oncontextmenu="return logMouse(event)" ondblclick="return logMouse(event)" value="Кликни меня левой или правой кнопкой мыши" type="button"> <input onclick="logClear('test')" value="Очистить" type="button"> <form id="testform" name="testform"> <textarea style="font-size:12px;height:150px;width:360px;"></textarea></form> |
55 | 48 | ``` |
56 | 49 |
|
57 | | -## Получение информации о кнопке: which |
| 50 | +## Кнопки мыши |
| 51 | + |
| 52 | +События, связанные с кликом, всегда имеют свойство `button`, которое позволяет получить конкретную кнопку мыши. |
| 53 | + |
| 54 | +Обычно мы не используем его для событий `click` и `contextmenu`, потому что первое происходит только при щелчке левой кнопкой мыши, а второе - только при щелчке правой кнопкой мыши. |
58 | 55 |
|
59 | | -События, связанные с кликом, всегда имеют свойство `which`, которое позволяет определить нажатую кнопку мыши. |
| 56 | +С другой стороны, обработчикам `mousedown` и `mouseup` может потребоваться `event.button`, потому что эти события срабатывают на любую кнопку, таким образом `button` позволяет различать "нажатие правой кнопки" и "нажатие левой кнопки". |
60 | 57 |
|
61 | | -Это свойство не используется для событий `click` и `contextmenu`, поскольку первое происходит только при нажатии левой кнопкой мыши, а второе -- правой. |
| 58 | +Возможными значениями `event.button` являются: |
62 | 59 |
|
63 | | -Но если мы отслеживаем `mousedown` и `mouseup`, то оно нам нужно, потому что эти события срабатывают на любой кнопке, и `which` позволяет различать между собой "нажатие правой кнопки" и "нажатие левой кнопки". |
| 60 | +| Состояние кнопки | `event.button` | |
| 61 | +|--------------|----------------| |
| 62 | +| Левая кнопка (основная) | 0 | |
| 63 | +| Средняя кнопка (вспомогательная) | 1 | |
| 64 | +| Правая кнопка (вторичная) | 2 | |
| 65 | +| Кнопка X1 (назад) | 3 | |
| 66 | +| Кнопка X2 (вперёд) | 4 | |
64 | 67 |
|
65 | | -Есть три возможных значения: |
| 68 | +Большинство мышек имеют только левую и правую кнопку, поэтому возможные значения это 0 или 2. Сенсорные устройства также генерируют аналогичные события, когда кто-то нажимает на них. |
66 | 69 |
|
67 | | -- `event.which == 1` -- левая кнопка |
68 | | -- `event.which == 2` -- средняя кнопка |
69 | | -- `event.which == 3` -- правая кнопка |
| 70 | +Также есть свойство `event.buttons`, в котором все нажатые в данный момент кнопки представлены в виде целого числа, по одному биту на кнопку. На практике это свойство используется очень редко, вы можете найти подробную информацию по адресу [MDN](mdn:/api/MouseEvent/buttons), если вам это когда-нибудь понадобится. |
| 71 | + |
| 72 | +```warn header="Устаревшее свойство `event.which`" |
| 73 | +В старом коде вы можете встретить `event.which` свойство - это старый нестандартный способ получения кнопки с возможными значениями: |
| 74 | + |
| 75 | +- `event.which == 1` – левая кнопка, |
| 76 | +- `event.which == 2` – средняя кнопка, |
| 77 | +- `event.which == 3` – правая кнопка. |
| 78 | + |
| 79 | +На данный момент `event.which` устарел, нам не следует его использовать. |
| 80 | +``` |
70 | 81 |
|
71 | 82 | Средняя кнопка сейчас -- скорее экзотика, и используется очень редко. |
72 | 83 |
|
73 | 84 | ## Модификаторы: shift, alt, ctrl и meta |
74 | 85 |
|
75 | 86 | Все события мыши включают в себя информацию о нажатых клавишах-модификаторах. |
76 | 87 |
|
77 | | -Свойства объекта события: |
| 88 | +Свойства события: |
78 | 89 |
|
79 | 90 | - `shiftKey`: `key:Shift` |
80 | 91 | - `altKey`: `key:Alt` (или `key:Opt` для Mac) |
|
116 | 127 | ``` |
117 | 128 |
|
118 | 129 | ```warn header="Не забывайте про мобильные устройства" |
119 | | -Комбинации клавиш на клавиатуре -- это хорошее дополнение к рабочему процессу. Если у пользователя есть клавиатура -- они работают. Ну а если на его устройстве её нет -- должен быть другой способ сделать то же самое. |
| 130 | +Комбинации клавиш хороши в качестве дополнения к рабочему процессу. Так что, если посетитель использует клавиатуру – они работают. |
| 131 | +
|
| 132 | +Но если на их устройстве его нет – тогда должен быть способ жить без клавиш-модификаторов. |
120 | 133 | ``` |
121 | 134 |
|
122 | 135 | ## Координаты: clientX/Y, pageX/Y |
|
126 | 139 | 1. Относительно окна: `clientX` и `clientY`. |
127 | 140 | 2. Относительно документа: `pageX` и `pageY`. |
128 | 141 |
|
129 | | -Например, если у нас есть окно размером 500x500, и курсор мыши находится в левом верхнем углу, то значения `clientX` и `clientY` равны `0`. А если мышь находится в центре окна, то значения `clientX` и `clientY` равны `250` независимо от того, в каком месте документа она находится и до какого места документ прокручен. В этом они похожи на `position:fixed`. |
| 142 | +Мы уже рассмотрели разницу между ними в главе <info:coordinates>. |
| 143 | + |
| 144 | +Если в кратце, то относительные координаты документа `pageX/Y` отсчитываются от левого верхнего угла документа и не меняются при прокрутке страницы, в то время как `clientX/Y` отсчитываются от левого верхнего угла текущего окна. Когда страница прокручивается, они меняются. |
| 145 | + |
| 146 | +Например, если у нас есть окно размером 500x500, и курсор мыши находится в левом верхнем углу, то значения `clientX` и `clientY` равны `0`, независимо от того, как прокручивается страница. |
| 147 | + |
| 148 | +А если мышь находится в центре окна, то значения `clientX` и `clientY` равны `250` независимо от того, в каком месте документа она находится и до какого места документ прокручен. В этом они похожи на `position:fixed`. |
130 | 149 |
|
131 | 150 | ````online |
132 | 151 | Наведите курсор мыши на поле ввода, чтобы увидеть `clientX/clientY` (пример находится в `iframe`, поэтому координаты определяются относительно этого `iframe`): |
|
185 | 204 |
|
186 | 205 | События мыши имеют следующие свойства: |
187 | 206 |
|
188 | | -- Кнопка: `which`. |
| 207 | +- Кнопка: `button`. |
189 | 208 | - Клавиши-модификаторы (`true` если нажаты): `altKey`, `ctrlKey`, `shiftKey` и `metaKey` (Mac). |
190 | 209 | - Если вы планируете обработать `key:Ctrl`, то не забудьте, что пользователи Mac обычно используют `key:Cmd`, поэтому лучше проверить `if (e.metaKey || e.ctrlKey)`. |
191 | 210 |
|
|
0 commit comments