Skip to content

Commit d82350d

Browse files
authored
Merge pull request #1604 from Rnbsov/patch-61
Update article about mouse events
2 parents d23190b + 680a93c commit d82350d

File tree

2 files changed

+48
-29
lines changed

2 files changed

+48
-29
lines changed

2-ui/3-event-details/1-mouse-events-basics/article.md

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
# Основы событий мыши
23

34
В этой главе мы более детально рассмотрим события мыши и их свойства.
@@ -6,11 +7,7 @@
67

78
## Типы событий мыши
89

9-
Мы можем разделить события мыши на две категории: "простые" и "комплексные".
10-
11-
### Простые события
12-
13-
Самые часто используемые простые события:
10+
Мы уже видели некоторые из этих событий:
1411

1512
`mousedown/mouseup`
1613
: Кнопка мыши нажата/отпущена над элементом.
@@ -21,24 +18,20 @@
2118
`mousemove`
2219
: Каждое движение мыши над элементом генерирует это событие.
2320

24-
`contextmenu`
25-
: Вызывается при попытке открытия контекстного меню, как правило, нажатием правой кнопки мыши. Но, заметим, это не совсем событие мыши, оно может вызываться и специальной клавишей клавиатуры.
26-
27-
...Есть также несколько иных типов событий, которые мы рассмотрим позже.
28-
29-
### Комплексные события
30-
3121
`click`
3222
: Вызывается при `mousedown` , а затем `mouseup` над одним и тем же элементом, если использовалась левая кнопка мыши.
3323

3424
`dblclick`
3525
: Вызывается двойным кликом на элементе.
3626

37-
Комплексные события состоят из простых, поэтому в теории мы могли бы без них обойтись. Но хорошо, что они существуют, потому что работать с ними очень удобно.
27+
`contextmenu`
28+
: Вызывается при попытке открытия контекстного меню, как правило, нажатием правой кнопки мыши. Но, заметим, это не совсем событие мыши, оно может вызываться и специальной клавишей клавиатуры.
3829

39-
### Порядок событий
30+
...Есть также несколько иных типов событий, которые мы рассмотрим позже.
4031

41-
Одно действие может вызвать несколько событий.
32+
## Порядок событий
33+
34+
Как вы можете видеть из приведённого выше списка, действие пользователя может вызвать несколько событий.
4235

4336
Например, клик мышью вначале вызывает `mousedown`, когда кнопка нажата, затем `mouseup` и `click`, когда она отпущена.
4437

@@ -49,32 +42,50 @@
4942
5043
В окне теста ниже все события мыши записываются, и если задержка между ними более 1 секунды, то они разделяются горизонтальной чертой.
5144
52-
При этом мы также можем увидеть свойство `which`, которое позволяет определить, какая кнопка мыши была нажата.
45+
Кроме того, мы можем видеть свойство `button`, которое позволяет нам определять кнопку мыши; это объясняется ниже.
5346
5447
<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>
5548
```
5649

57-
## Получение информации о кнопке: which
50+
## Кнопки мыши
51+
52+
События, связанные с кликом, всегда имеют свойство `button`, которое позволяет получить конкретную кнопку мыши.
53+
54+
Обычно мы не используем его для событий `click` и `contextmenu`, потому что первое происходит только при щелчке левой кнопкой мыши, а второе - только при щелчке правой кнопкой мыши.
5855

59-
События, связанные с кликом, всегда имеют свойство `which`, которое позволяет определить нажатую кнопку мыши.
56+
С другой стороны, обработчикам `mousedown` и `mouseup` может потребоваться `event.button`, потому что эти события срабатывают на любую кнопку, таким образом `button` позволяет различать "нажатие правой кнопки" и "нажатие левой кнопки".
6057

61-
Это свойство не используется для событий `click` и `contextmenu`, поскольку первое происходит только при нажатии левой кнопкой мыши, а второе -- правой.
58+
Возможными значениями `event.button` являются:
6259

63-
Но если мы отслеживаем `mousedown` и `mouseup`, то оно нам нужно, потому что эти события срабатывают на любой кнопке, и `which` позволяет различать между собой "нажатие правой кнопки" и "нажатие левой кнопки".
60+
| Состояние кнопки | `event.button` |
61+
|--------------|----------------|
62+
| Левая кнопка (основная) | 0 |
63+
| Средняя кнопка (вспомогательная) | 1 |
64+
| Правая кнопка (вторичная) | 2 |
65+
| Кнопка X1 (назад) | 3 |
66+
| Кнопка X2 (вперёд) | 4 |
6467

65-
Есть три возможных значения:
68+
Большинство мышек имеют только левую и правую кнопку, поэтому возможные значения это 0 или 2. Сенсорные устройства также генерируют аналогичные события, когда кто-то нажимает на них.
6669

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+
```
7081
7182
Средняя кнопка сейчас -- скорее экзотика, и используется очень редко.
7283
7384
## Модификаторы: shift, alt, ctrl и meta
7485
7586
Все события мыши включают в себя информацию о нажатых клавишах-модификаторах.
7687
77-
Свойства объекта события:
88+
Свойства события:
7889
7990
- `shiftKey`: `key:Shift`
8091
- `altKey`: `key:Alt` (или `key:Opt` для Mac)
@@ -116,7 +127,9 @@
116127
```
117128
118129
```warn header="Не забывайте про мобильные устройства"
119-
Комбинации клавиш на клавиатуре -- это хорошее дополнение к рабочему процессу. Если у пользователя есть клавиатура -- они работают. Ну а если на его устройстве её нет -- должен быть другой способ сделать то же самое.
130+
Комбинации клавиш хороши в качестве дополнения к рабочему процессу. Так что, если посетитель использует клавиатуру – они работают.
131+
132+
Но если на их устройстве его нет – тогда должен быть способ жить без клавиш-модификаторов.
120133
```
121134

122135
## Координаты: clientX/Y, pageX/Y
@@ -126,7 +139,13 @@
126139
1. Относительно окна: `clientX` и `clientY`.
127140
2. Относительно документа: `pageX` и `pageY`.
128141

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`.
130149

131150
````online
132151
Наведите курсор мыши на поле ввода, чтобы увидеть `clientX/clientY` (пример находится в `iframe`, поэтому координаты определяются относительно этого `iframe`):
@@ -185,7 +204,7 @@
185204

186205
События мыши имеют следующие свойства:
187206

188-
- Кнопка: `which`.
207+
- Кнопка: `button`.
189208
- Клавиши-модификаторы (`true` если нажаты): `altKey`, `ctrlKey`, `shiftKey` и `metaKey` (Mac).
190209
- Если вы планируете обработать `key:Ctrl`, то не забудьте, что пользователи Mac обычно используют `key:Cmd`, поэтому лучше проверить `if (e.metaKey || e.ctrlKey)`.
191210

2-ui/3-event-details/1-mouse-events-basics/head.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
function logMouse(e) {
2626
let evt = e.type;
2727
while (evt.length < 11) evt += ' ';
28-
showmesg(evt + " which=" + e.which, 'test')
28+
showmesg(evt + " button=" + e.button, 'test')
2929
return false;
3030
}
3131

0 commit comments

Comments
 (0)