Skip to content

Commit 4ea0eba

Browse files
committed
minor
1 parent b218d69 commit 4ea0eba

File tree

1 file changed

+28
-30
lines changed

1 file changed

+28
-30
lines changed

2-ui/2-events/04-default-browser-action/article.md

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
Есть два способа отменить действие браузера:
1616

1717
- Основной способ – это воспользоваться объектом `event`. Для отмены действия браузера существует стандартный метод `event.preventDefault()`.
18-
- Если же обработчик назначен через `on<событие>` (не через `addEventListener`), то можно просто вернуть `false` из обработчика.
18+
- Если же обработчик назначен через `on<событие>` (не через `addEventListener`), то также можно вернуть `false` из обработчика.
1919

2020
В следующем примере при клике по ссылке переход не произойдет:
2121

@@ -30,7 +30,7 @@
3030

3131
Единственное исключение – это `return false` из обработчика, назначенного через `on<событие>`.
3232

33-
В других случаях return не нужен, он никак не обрабатываются.
33+
В других случаях `return` не нужен, он никак не обрабатываются.
3434
```
3535
3636
### Пример: меню
@@ -49,7 +49,7 @@
4949

5050
[iframe height=70 src="menu" link edit]
5151

52-
HTML-разметка сделана так, что все элементы меню являются не кнопками, а ссылками, то есть тегами `<a>`. В этом подходе есть некоторые преимущества, например:
52+
В HTML-разметке все элементы меню являются не кнопками, а ссылками, то есть тегами `<a>`. В этом подходе есть некоторые преимущества, например:
5353

5454
- Некоторые посетители очень любят сочетание "правый клик – открыть в новом окне". Если мы будем использовать `<button>` или `<span>`, то данное сочетание работать не будет.
5555
- Поисковые движки переходят по ссылкам `<a href="...">` при индексации.
@@ -66,32 +66,29 @@ menu.onclick = function(event) {
6666
alert( href ); // может быть подгрузка с сервера, генерация интерфейса и т.п.
6767

6868
*!*
69-
return false; // отменить переход по url
69+
return false; // отменить действие браузера (переход по ссылке)
7070
*/!*
7171
};
7272
```
7373

74-
Если мы уберём `return false`, то после выполнения обработчика события браузер выполнит "действие по умолчанию" - переход по адресу из `href`.
74+
Если мы уберём `return false`, то после выполнения обработчика события браузер выполнит "действие по умолчанию" - переход по адресу из `href`. А это нам здесь не нужно, мы обрабатываем клик сами.
7575

76-
Кстати, использование здесь делегирования событий делает наше меню гибким. Мы можем добавить вложенные списки и стилизовать их с помощью CSS – обработчик не потребует изменений.
76+
Кстати, использование здесь делегирования событий делает наше меню очень гибким. Мы можем добавить вложенные списки и стилизовать их с помощью CSS – обработчик не потребует изменений.
7777

78-
79-
## Отмена последующих событий
80-
81-
Некоторые события естественным образом вытекают друг из друга. Если мы отменим первое событие, то последующие не выполнятся.
78+
````smart header="События, вытекающие из других"
79+
Некоторые события естественным образом вытекают друг из друга. Если мы отменим первое событие, то последующие не возникнут.
8280
8381
Например, событие `mousedown` для поля `<input>` приводит к фокусировке на нём и запускает событие `focus`. Если мы отменим событие `mousedown`, то фокусирования не произойдёт.
8482
85-
В следующем примере попробуйте нажать на первом `<input>` -- происходит событие `focus`. Это нормально.
86-
87-
Но если вы нажимаете по второму элементу, то события `focus` не будет.
83+
В следующем примере попробуйте нажать на первом `<input>` -- происходит событие `focus`. Но если вы нажимаете по второму элементу, то события `focus` не будет.
8884
8985
```html run autorun
9086
<input value="Фокус работает" onfocus="this.value=''">
9187
<input *!*onmousedown="return false"*/!* onfocus="this.value=''" value="Кликни меня">
9288
```
9389
94-
Это потому, что отменено стандартное действие `mousedown`. Но фокусировка на элементе всё ещё возможна, если мы будем использовать другой способ. Например, нажатием клавиши `key:Tab` можно перейти от первого поля ввода ко второму. Но только не через нажатие мышью по элементу, это больше не работает.
90+
Это потому, что отменено стандартное действие `mousedown`. Впрочем, фокусировка на элементе всё ещё возможна, если мы будем использовать другой способ. Например, нажатием клавиши `key:Tab` можно перейти от первого поля ввода ко второму. Но только не через клик мышью на элемент, это больше не работает.
91+
````
9592

9693
## Опция "passive" для обработчика
9794

@@ -105,7 +102,7 @@ menu.onclick = function(event) {
105102

106103
Опция `passive: true` сообщает браузеру, что обработчик не собирается отменять прокрутку. Тогда браузер начинает её немедленно, обеспечивая максимально плавный интерфейс, параллельно обрабатывая событие.
107104

108-
Для некоторых браузеров (Firefox, Chrome) опция `passive` по умолчанию включена `true` для таких событий, как `touchstart` и `touchmove`.
105+
Для некоторых браузеров (Firefox, Chrome) опция `passive` по умолчанию включена в `true` для таких событий, как `touchstart` и `touchmove`.
109106

110107

111108
## event.defaultPrevented
@@ -116,25 +113,27 @@ menu.onclick = function(event) {
116113

117114
Помните, в главе <info:bubbling-and-capturing> мы говорили о `event.stopPropagation()` и упоминали, что останавливать "всплытие" - плохо?
118115

119-
Иногда вместо этого мы можем использовать `event.defaultPrevented`.
116+
Иногда вместо этого мы можем использовать `event.defaultPrevented`, чтобы просигналить другим обработчикам, что событие обработано.
120117

121-
Давайте посмотрим практический пример, где остановка всплытия кажется обязательной, но на самом деле мы можем обойтись без него.
118+
Давайте посмотрим практический пример.
122119

123120
По умолчанию браузер при событии `contextmenu` (клик правой кнопкой мыши) показывает контекстное меню со стандартными опциями. Мы можем отменить событие по умолчанию и показать своё меню, как здесь:
124121

125122
```html autorun height=50 no-beautify run
126-
<button>Кликните правой кнопкой мыши для вызова контекстного меню браузера</button>
123+
<button>Правый клик вызывает контекстное меню браузера</button>
127124

128125
<button *!*oncontextmenu="alert('Рисуем наше меню'); return false"*/!*>
129-
Кликните правой кнопкой мыши для вызова нашего контекстного меню
126+
Правый клик вызывает наше контекстное меню
130127
</button>
131128
```
132129

133-
Теперь предположим, что мы хотим реализовать собственное контекстное меню для всего документа с нашими опциями. И внутри документа мы можем иметь другие элементы, у которых может быть своё контекстное меню:
130+
Теперь в дополнение к этому контекстному меню реализуем контекстное меню для всего документа.
131+
132+
При правом клике должно показываться ближайшее контекстное меню.
134133

135134
```html autorun height=80 no-beautify run
136-
<p>Кликните правой кнопкой здесь для контекстного меню документа</p>
137-
<button id="elem">Кликните правой кнопкой здесь для контекстного меню кнопки</button>
135+
<p>Правый клик здесь вызывает контекстное меню документа</p>
136+
<button id="elem">Правый клик здесь вызывает контекстное меню кнопки</button>
138137

139138
<script>
140139
elem.oncontextmenu = function(event) {
@@ -151,11 +150,11 @@ menu.onclick = function(event) {
151150

152151
Проблема заключается в том, что когда мы кликаем по элементу `elem`, то мы получаем два меню: контекстное меню для кнопки и (событие всплывает вверх) контекстное меню для документа.
153152

154-
Одним из решений будет полностью обработать событие в обработчике кнопки и остановить всплытие, используя `event.stopPropagation()`:
153+
Как это поправить? Одно из решений - это подумать: "Когда мы обрабатываем правый клик в обработчике на кнопке, остановим всплытие", и вызвать `event.stopPropagation()`:
155154

156155
```html autorun height=80 no-beautify run
157-
<p>Кликните правой кнопкой для меню документа</p>
158-
<button id="elem">Кликните правой кнопкой для меню кнопки (добавлен event.stopPropagation)</button>
156+
<p>Правый клик вызывает меню документа</p>
157+
<button id="elem">Правый клик вызывает меню кнопки (добавлен event.stopPropagation)</button>
159158

160159
<script>
161160
elem.oncontextmenu = function(event) {
@@ -179,8 +178,8 @@ menu.onclick = function(event) {
179178

180179

181180
```html autorun height=80 no-beautify run
182-
<p>Кликните правой кнопкой мыши для меню документа (добавлен event.defaultPrevented)</p>
183-
<button id="elem">Кликните правой кнопкой для меню кнопки</button>
181+
<p>Правый клик вызывает меню документа (добавлена проверка event.defaultPrevented)</p>
182+
<button id="elem">Правый клик вызывает меню кнопки</button>
184183

185184
<script>
186185
elem.oncontextmenu = function(event) {
@@ -206,7 +205,7 @@ menu.onclick = function(event) {
206205
```
207206

208207
```smart header="Архитектура вложенных контекстных меню"
209-
Есть также несколько альтернативных путей, чтобы реализовать вложенные контекстные меню. Одним из них является специальный глобальный объект с методом, который обрабатывает `document.oncontextmenu`, и также методами, позволяющими хранить в нём различные "низкоуровневые" обработчики.
208+
Есть также несколько альтернативных путей, чтобы реализовать вложенные контекстные меню. Одним из них является единый глобальный объект с обработчиком `document.oncontextmenu` и методами, позволяющими хранить в нём другие обработчики.
210209
211210
Объект будет перехватывать любой клик правой кнопкой мыши, просматривать сохранённые обработчики и запускать соответствующий.
212211
@@ -220,7 +219,6 @@ menu.onclick = function(event) {
220219
- `mousedown` -- начинает выделять текст (если двигать мышкой).
221220
- `click` на `<input type="checkbox">` -- ставит или убирает галочку в `input`.
222221
- `submit` -- при нажатии на `<input type="submit">` или при нажатии клавиши `key:Enter` в форме данные отправляются на сервер.
223-
- `wheel` -- движение колёсика мыши инициирует прокрутку.
224222
- `keydown` -- при нажатии клавиши в поле ввода появляется символ.
225223
- `contextmenu` -- при правом клике показывается контекстное меню браузера.
226224
- ...и многие другие...
@@ -238,7 +236,7 @@ menu.onclick = function(event) {
238236
239237
Но нам следует сохранять семантическое значение HTML элементов. Например, не кнопки, а тег `<a>` должен применяться для переходов по ссылкам.
240238
241-
Помимо того, что это "хорошо", это делает ваш HTML лучше с точки зрения доступности.
239+
Помимо того, что это "хорошо", это делает ваш HTML лучше с точки зрения доступности для инвалидов и с особых устройств.
242240
243241
Также, если мы рассматриваем пример с тегом `<a>`, то обратите внимание: браузер предоставляет возможность открывать ссылки в новом окне (кликая правой кнопкой мыши или используя другие возможности). И пользователям это нравится. Но если мы заменим ссылку кнопкой и стилизуем её как ссылку, используя CSS, то специфичные функции браузера для тега `<a>` всё равно работать не будут.
244242
```

0 commit comments

Comments
 (0)