You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Есть некоторые события, как `touchmove` на мобильных устройствах (когда пользователь перемещает палец по экрану), которое по умолчанию запускает скроллинг, но мы можем отменить это действие, используя `preventDefault()` в обработчике.
102
+
Есть некоторые события, как `touchmove` на мобильных устройствах (когда пользователь перемещает палец по экрану), которое по умолчанию начинает прокрутку, но мы можем отменить это действие, используя `preventDefault()` в обработчике.
103
103
104
-
Поэтому, когда браузер обнаружит такое событие, он должен для начала обработать все обработчики и после, если `preventDefault` не вызывается нигде, он может продолжить скроллинг. Это может вызвать ненужные задержки и "дрожание" в пользовательском интерфейсе.
104
+
Поэтому, когда браузер обнаружит такое событие, он должен для начала запустить все обработчики и после, если `preventDefault` не вызывается нигде, он может начать прокрутку. Это может вызвать ненужные задержки в пользовательском интерфейсе.
105
105
106
-
Опция `passive: true` сообщает браузеру, что обработчик не собирается отменять скроллинг. Тогда браузер запускает скроллинг немедленно, обеспечивая максимально плавный интерфейс, параллельно обрабатывая событие.
106
+
Опция `passive: true` сообщает браузеру, что обработчик не собирается отменять прокрутку. Тогда браузер начинает её немедленно, обеспечивая максимально плавный интерфейс, параллельно обрабатывая событие.
107
107
108
108
Для некоторых браузеров (Firefox, Chrome) опция `passive` по умолчанию включена `true` для таких событий, как `touchstart` и `touchmove`.
клик правой кнопкой мыши для вызова нашего контекстного меню
129
+
Кликните правой кнопкой мыши для вызова нашего контекстного меню
130
130
</button>
131
131
```
132
132
133
133
Теперь предположим, что мы хотим реализовать собственное контекстное меню для всего документа с нашими опциями. И внутри документа мы можем иметь другие элементы, у которых может быть своё контекстное меню:
134
134
135
135
```html autorun height=80 no-beautify run
136
-
<p>клик правой кнопкой мыши для контекстного меню документа</p>
137
-
<buttonid="elem">клик правой кнопкой мыши для контекстного меню кнопки</button>
136
+
<p>Кликните правой кнопкой здесь для контекстного меню документа</p>
137
+
<buttonid="elem">Кликните правой кнопкой здесь для контекстного меню кнопки</button>
Теперь контекстное меню для кнопки работает как задумано. Но цена слишком высока. Мы навсегда запретили доступ к контекстному меню для любого внешнего кода, включая счётчики, которые собирают статистику, и так далее. Это слегка неразумно.
176
+
Теперь контекстное меню для кнопки работает как задумано. Но цена слишком высока. Мы навсегда запретили доступ к информации о правых кликах для любого внешнего кода, включая счётчики, которые могли бы собирать статистику, и т.п. Это слегка неразумно.
177
177
178
178
Альтернативным решением было бы проверить в обработчике `document`, было ли отменено действие по умолчанию? Если да, тогда событие было обработано, и нам не нужно на него реагировать.
179
179
180
180
181
181
```html autorun height=80 no-beautify run
182
182
<p>клик правой кнопкой мыши для меню документа (добавлен event.defaultPrevented)</p>
183
-
<buttonid="elem">клик правой кнопкой мыши для меню кнопки</button>
183
+
<buttonid="elem">Кликните правой кнопкой для меню кнопки</button>
Сейчас всё работает правильно. Если у нас есть вложенные элементы и каждый из них имеет контекстное меню, то код также будет работать. Просто убедитесь, что проверяете `event.defaultPrevented`для каждого обработчика`contextmenu`.
202
+
Сейчас всё работает правильно. Если у нас есть вложенные элементы и каждый из них имеет контекстное меню, то код также будет работать. Просто убедитесь, что проверяете `event.defaultPrevented`в каждом обработчике`contextmenu`.
203
203
204
204
```smart header="event.stopPropagation() и event.preventDefault()"
205
205
Как мы можем видеть, `event.stopPropagation()` и `event.preventDefault()` (также известный как `return false`) - это две разные функции. Они никак не связаны друг с другом.
Объект будет перехватывать любой клик правой кнопкой мыши, просматривать сохранённые обработчики и запускать соответствующий.
212
212
213
-
Но затем каждый фрагмент кода, которому требуется контекстное меню, должен знать об этом объекте и использовать его вместо собственного обработчика `contextmenu`.
213
+
Но при этом каждый фрагмент кода, которому требуется контекстное меню, должен знать об этом объекте и использовать его вместо собственного обработчика `contextmenu`.
Чтобы отменить действие браузера по умолчанию, используйте `event.preventDefault()` или `return false`. Второй метод работает, только если обработчик назначен через `on<событие>`.
231
231
232
-
Опция `passive: true` для `addEventListener` сообщает браузеру, что действие по умолчанию не будет отменено. Это очень полезно для некоторых событий на мобильных устройствах, таких как `touchstart` и `touchmove`, чтобы сообщить браузеру, что он не должен ожидать выполнения всех обработчиков, а ему следует сразу приступать к выполнению действия по умолчанию, например, скроллинга.
232
+
Опция `passive: true` для `addEventListener` сообщает браузеру, что действие по умолчанию не будет отменено. Это очень полезно для некоторых событий на мобильных устройствах, таких как `touchstart` и `touchmove`, чтобы сообщить браузеру, что он не должен ожидать выполнения всех обработчиков, а ему следует сразу приступать к выполнению действия по умолчанию, например, к прокрутке.
233
233
234
234
Если событие по умолчанию отменено, то значение `event.defaultPrevented` становится `true`, иначе `false`.
0 commit comments